FreeRTOS从V8.2.0版本开始提供任务通知这个功能,每个任务多有一个32位的通知值,任务通知比二进制信号量方式解除阻塞任务速率提升45%,并且无需创建队列更加省内存。
osSignalSet和osSignalWait是CMSIS中的任务通知,在文档cmsis_os.c中定义;
osSignalSet是对FreeRTOS中的xTaskNotifyFromISR和xTaskNotify的封装,该函数对函数所处环境进行了判断,当处于中断回调函数中时使用xTaskNotifyFromISR,否则使用xTaskNotify,这样使用者无需关心通知的来源直接使用;
osSignalWait是对xTaskNotifyWait的封装,该函数不能用于中断中否则返回osErrorISR;
xTaskNotifyFromISR/xTaskNotify和xTaskNotifyWait是FreeRTOS中任务通知,更准确的说是任务通知的一部分用法,在文档task.c中定义;想进一步了解其他任务通知函数用法比如ulTaskNotifyTake和xTaskNotifyGive等,请看源码task.c。
osSignalSet发送通知时发送通知并带通知值,osSignalWait等待通知(接收通知值时清零和等待超时时长);
任务通知的使用限制条件:
1.只能有一个任务接收通知事件。
2.接收通知的任务可以因为等待通知而进入阻塞状态,但是发送通知的任务即便不能立即完成通知发送也不能进入阻塞状态。
通知的发送可以从多个任务或者多个中断中发出,但是等待任务通知函数只能有一个。这个地方可能有的人会理解错误,以为只能有一个等待任务通知,其实这里说的是一个任务中只能有一个等待任务通知函数,其他任务中还可以有等待任务通知函数;
发送通知
函数描述:
/*************************** Signal Management ********************************/
/**
* @brief Set the specified Signal Flags of an active thread.
* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
* @param signals specifies the signal flags of the thread that should be set.
* @retval osOK if successful, osErrorOS if failed .
* @note MUST REMAIN UNCHANGED: \b osSignalSet shall be consistent in every CMSIS-RTOS.
*/
int32_t osSignalSet (osThreadId thread_id, int32_t signal)
<