原文地址为:https://blog.csdn.net/zhzht19861011/article/details/50578159
注:本文介绍任务通知的基础知识,详细源码分析见《FreeRTOS高级篇8---FreeRTOS任务通知分析》 每个RTOS任务都有一个32位的通知值,任务创建时,这个值被初始化为0。RTOS任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除阻塞状态,前提是这个阻塞事件是因等待通知而引起的。发送通知的同时,也可以可选的改变接收任务的通知值。 可以通过下列方法向接收任务更新通知:
- 不覆盖接收任务的通知值
- 覆盖接收任务的通知值
- 设置接收任务通知值的某些位
- 增加接收任务的通知值
相对于用前必须分别创建队列、二进制信号量、计数信号量或事件组的情况,使用任务通知显然更灵活。更好的是,相比于使用信号量解除任务阻塞,使用任务通知可以快45%、使用更少的RAM(使用GCC编译器,-o2优化级别)。 使用API函数xTaskNotify()和xTaskNotifyGive()(中断保护等价函数为xTaskNotifyFromISR()和vTaskNotifyGiveFromISR())发送通知,在接收RTOS任务调用API函数xTaskNotifyWait()或ulTaskNotifyTake()之前,这个通知都被保持着。如果接收RTOS任务已经因为等待通知而进入阻塞状态,则接收到通知后任务解除阻塞并清除通知。 RTOS任务通知功能默认是使能的,可以通过在文件FreeRTOSConfig.h中设置宏configUSE_TASK_NOTIFICATIONS为0来禁止这个功能,禁止后每个任务节省8字节内存。 虽然RTOS任务通知速度更快并且占用内存更少,但它也有一些限制:
- 只能有一个任务接收通知事件。
- 接收通知的任务可以因为等待通知而进入阻塞状态,但是发送通知的任务即便不能立即完成通知发送也不能进入阻塞状态。
1.发送通知-方法1
1.1函数描述
BaseType_t xTaskNotify( TaskHandle_txTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction);
向指定任务发送指定的通知值。如果打算使用RTOS任务通知实现轻量级的二进制或计数信号量,推荐使用API函数xTaskNotifyGive()来代替本函数。 此函数不可以在中断服务例程中调用,中断保护等价函数为xTaskNotifyFromISR()。 1.2参数描述
- xTaskToNotify:被通知的任务句柄。
- ulValue:通知更新值
- eAction:枚举类型,指明更新通知值的方法
枚举变量成员以及作用如下表所示。 1.3返回值 参数eAction为eSetValueWithoutOverwrite时,如果被通知任务还没取走上一个通知,又接收到了一个通知,则这次通知值未能更新并返回pdFALSE,否则返回pdPASS。 |