FreeRTOS 灵活的任务调度与协作框架概述

目录

一、信号量(Semaphore):资源计数与事件通知

二、互斥锁(Mutex):临界资源保护

三、事件组(Event Group):多事件组合通知

四、任务通知(Task Notification):轻量级直接通知

五、流缓冲区与消息缓冲区:大数据量传输

1. 流缓冲区(Stream Buffer)

2. 消息缓冲区(Message Buffer)

六、软件定时器(Software Timer):周期性/延迟任务

七、临界区与关中断:原子操作保护

八、钩子函数(Hook Functions):扩展调度器行为

总结:FreeRTOS 的机制协同


在 FreeRTOS 中,除了“队列+后台任务”的生产者-消费者模式外,还有多种​​任务间通信(IPC, Inter-Process Communication)​​和​​同步机制​​,以及​​系统扩展机制​​。这些机制各有侧重,共同构成了 FreeRTOS 灵活的任务调度与协作框架。以下是最常用的几类机制及其典型应用场景:

一、信号量(Semaphore):资源计数与事件通知

​核心功能​​:通过计数或二进制状态,实现资源的互斥访问或事件的通知。

​分类​​:

  • ​二进制信号量(Binary Semaphore)​​:状态仅 0(不可用)或 1(可用),用于互斥或单次事件通知。

  • ​计数信号量(Counting Semaphore)​​:计数值可大于 1,用于资源池管理(如多个相同资源)。

​典型场景​​:

  • ​互斥访问外设​​:如多个任务访问同一 UART 时,用二进制信号量保护 UART 寄存器(替代互斥锁的轻量方案)。

  • ​事件通知​​:如传感器任务完成数据采集后,释放信号量通知显示任务更新界面。

​API 示例​​:

SemaphoreHandle_t xSemaphore;

// 创建二进制信号量
xSemaphore = xSemaphoreCreateBinary();

// 任务 A 获取信号量(等待资源)
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdPASS) {
    // 访问共享资源(如 UART)
    UART_SendData("Hello");
    // 释放信号量
    xSemaphoreGive(xSemaphore);
}

// 任务 B 完成操作后释放信号量
xSemaphoreGive(xSemaphore);

二、互斥锁(Mutex):临界资源保护

​核心功能​​:专用于保护​​临界资源​​(如共享内存、硬件寄存器),防止多任务并发访问导致的竞态条件,并解决​​优先级反转​​问题(高优先级任务等待低优先级任务释放锁时,低优先级任务被临时提升优先级)。

​与信号量的区别​​:

  • 互斥锁是“专用”的,仅用于资源互斥,不可用于事件通知;

  • 互斥锁支持​​优先级继承​​(Priority Inheritance),避免优先级反转;

  • 信号量是“通用”的,可用于资源计数或事件通知。

​典型场景​​:

  • ​保护共享内存​​:如多个任务访问同一全局变量(如温度校准参数)。

  • ​操作硬件寄存器​​:如直接操作 I2C/SPI 控制寄存器时,用互斥锁确保同一时间只有一个任务操作。

​API 示例​​:

SemaphoreHandle_t xMutex;

// 创建互斥锁
xMutex = xSemaphoreCreateMutex();

// 任务 A 访问临界资源
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdPASS) {
    // 修改共享变量或寄存器
    gSharedVar = 100;
    // 释放互斥锁
    xSemaphoreGive(xMutex);
}

三、事件组(Event Group):多事件组合通知

​核心功能​​:允许任务等待​​多个事件​​的组合发生(逻辑与/或),适用于需要多条件触发的场景

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蘑菇二号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值