FreeRTOS 任务通知使用教程
任务通知是 FreeRTOS 提供的一种高效的线程间通信机制。每个 RTOS 任务都有一个 32 位的通知值,任务创建时,这个值被初始化为 0。任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除阻塞状态,前提是这个阻塞事件是因等待通知而引起的。发送通知的同时,也可以可选地改变接收任务的通知值。本文将详细介绍如何在 FreeRTOS 中使用任务通知。
任务通知的更新方式
可以通过以下方法向接收任务更新通知:
- 不覆盖接收任务的通知值
- 覆盖接收任务的通知值
- 设置接收任务通知值的某些位
- 增加接收任务的通知值
1. 任务控制块的通知定义
任务通知的定义在 taskTCB
任务控制块中,受控于宏 configUSE_TASK_NOTIFICATIONS
。该宏默认开启,所以任务通知功能默认启用。
2. 任务通知的基本用法
任务通知可以只发送通知,不附带任何值。这种用法类似于信号量,因此任务通知的接口也提供了类似信号量接口的形式,方便使用和区分:
xTaskNotifyGive
:释放任务通知(类似于xSemaphoreGive
释放信号量)ulTaskNotifyTake
:获取任务通知(类似于xSemaphoreTake
获取信号量)
2.1 使用示例
以下示例展示了 task1
每隔 8 秒释放一个任务通知给 task2
,task2
每隔 1 秒尝试获取任务通知,获取超时时间为 10 秒。
void NotifyTask1_entry(void* parameter)
{
uint32_t send1 = 1;
uint32_t ret_num;
while(1)
{
vTaskDelay(configTICK_RATE_HZ*8);
ret = xTaskNotifyGive(task2StaticHandle);
}
}
void NotifyTask2_entry(void* parameter)
{
while(1)
{