FreeRTOS 中的 任务通知(Task Notification) 是一种轻量级的高效通信机制,允许任务之间或中断直接向特定任务发送事件或数据。相比队列、信号量等传统机制,任务通知具有 更快的速度和更低的内存开销(无需额外创建对象),但功能相对受限(如仅支持单向通信)。以下是任务通知相关的 API 函数详解及使用指南。
任务通知的核心特性
- 轻量高效:每个任务自带通知值(32位),无需额外内存分配。
- 多种模式:支持数值更新、事件标志位、计数器等多种操作模式。
- 直接通信:可直接指定目标任务,无需中间对象(如队列)。
- 适用场景:
- 替代二值信号量/计数信号量。
- 轻量级事件标志组。
- 单次数据传输(类似轻量队列)。
任务通知 API 函数详解
1. 发送任务通知
基础发送函数
BaseType_t xTaskNotify(
TaskHandle_t xTaskToNotify, // 目标任务句柄
uint32_t ulValue, // 通知值(或掩码)
eNotifyAction eAction // 操作类型
);
- 功能:向指定任务发送通知,并根据
eAction更新目标任务的通知值。 - 参数:
eAction:指定更新方式,可选:eNoAction:仅触发通知,不修改通知值。eSetBits:按位或(ulValue为掩码)。eIncrement:通知值加 1(ulValue被忽略)。eSetValueWithOverwrite:直接覆盖通知值。eSetValueWithoutOverwrite:仅当通知值未被读取时覆盖。
- 返回值:
pdPASS:发送成功(某些模式下可能返回失败,如eSetValueWithoutOverwrite时通知值已存在)。
中断安全版本
BaseType_t xTaskNotifyFromISR(
TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
BaseType_t *pxHigherPriorityTaskWoken
);
pxHigherPriorityTaskWoken:标记是否需触发上下文切换(调用portYIELD_FROM_ISR())。
简化发送函数(类似信号量)

最低0.47元/天 解锁文章
700

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



