任务通知在 FreeRTOS 中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS
定义为 1。FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue
就是这个通知值。任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻
塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。
也可以更新接收任务的任务通知值,任务通知可以通过如下方法更新接收任务的通知值:
● 不覆盖接收任务的通知值(如果上次发送给接收任务的通知还没被处理)。
● 覆盖接收任务的通知值。
● 更新接收任务通知值的一个或多个 bit。
● 增加接收任务的通知值。
灵活、合理的使用这些更改任务通知值的方法在一些场合可以替代队列、二值信号量,计数信号量和事件标志组
API函数
发送任务通知:
获取任务通知:
xTaskNotify
函数原型
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction );
xTaskNotifyFromISR
函数原型
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
BaseType_t *pxHigherPriorityTaskWoken );
参数eAction
指定通知更新的方法,有如下方法
typedef enum
{
eNoAction = 0, /* Notify the task without updating its notify value. */
eSetBits, /* Set bits in the task's notification value. */
eIncrement, /* Increment the task's notification value. */
eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */
eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */
} eNotifyAction;
利用任务通知模拟二值信号量、计数型信号量
发送使用vTaskNotifyGive
或vTaskNotifyGiveFromISR
接收使用ulTaskNotifyTake
ulTaskNotifyTake
函数原型:
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
当参数xClearCountOnExit
为pdFALSE
时在退出函数前任务通知值会减1,可以用来模拟计数型信号量;
当参数xClearCountOnExit
为pdTRUE
时在退出函数前任务通知值会清零,可以用来模拟二值信号量;
利用任务通知模拟队列、事件
发送使用xTaskNotify
或xTaskNotifyFromISR
接收使用xTaskNotifyWait
xTaskNotifyWait函数原型
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,
uint32_t ulBitsToClearOnExit,
uint32_t *pulNotificationValue,
TickType_t xTicksToWait );
xTaskNotifyWait函数将获取到的任务通知值保存在pulNotificationValue
中