目录
四、任务通知(Task Notification):轻量级直接通知
六、软件定时器(Software Timer):周期性/延迟任务
八、钩子函数(Hook Functions):扩展调度器行为
在 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):多事件组合通知
核心功能:允许任务等待多个事件的组合发生(逻辑与/或),适用于需要多条件触发的场景

最低0.47元/天 解锁文章
1054

被折叠的 条评论
为什么被折叠?



