关于任务通知特点、优缺点:FreeRTOS任务通知
关于队列:FreeRTOS队列
特性
任务通知可以被用于向任务发送数据,但是有许多限制:
- 仅仅只能发送32位数据;
- 发送的数据保存在接收任务通知值里面,任务时刻只有一个任务通知值。
因此“轻量级的邮箱”也可以被用作“轻量级的队列”,任务通知的值就是邮箱值。
使用xTaskNotify()和xTaskNotifyFromISR()发送数据,参数eAction只能在eSetValueWithOverwrite和eSetValueWithoutOverwrite中取值。
如果eAction被设置为eSetValueWithOverwrite,那么接收任务的通知值将被更新,即使接收任务已经有了一个挂起的通知。如果eAction被设置为eSetValueWithoutOverwrite,那么接收任务的通知值只有在接收任务还没有挂起通知时才会更新——因为更新通知值会在接收任务处理之前覆盖之前的值。
任务使用xTaskNotifyWait()读取自己的任务通知值。
API说明
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction )
//向任务发送任务通知
//xTaskToNotify :是任务句柄
//ulValue :任务通知值
//eAction :发送任务通知值的方式,用于邮箱功能只能取eSetValueWithOverwrite或eSetValueWithoutOverwrite
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
BaseType_t *pxHigherPriorityTaskWoken );
//向任务发送任务通知,用于中断
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,
uint32_t ulBitsToClearOnExit,
uint32_t *pulNotificationValue,
TickType_t xTicksToWait );
//读取任务通知值
//ulBitsToClearOnEntry :表示读取之前是否清除,设置为0xffffffff将会清除
//ulBitsToClearOnExit :表示读取之后是否清楚,设置为0xffffffff将会清除
//pulNotificationValue :任务通知值
//xTicksToWait :阻塞时间