在回调函数中使用xTaskNotifyFromISR()函数发送任务通知,在任务中使用xTaskNotifyWait()函数获取任务通知,实际使用中发现任务发送通知计数与获取到的任务通知不一致,获取的少于发送的任务通知。
代码分析:
void set_event_info(uint32_t val)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
BaseType_t ret;
ret = xTaskNotifyFromISR((TaskHandle_t )EventGroupTask_Handler,//接收任务通知的任务句柄
(uint32_t )val, //要更新的bit
(eNotifyAction )eSetBits,
&xHigherPriorityTaskWoken);
}
发现在使用xTaskNotifyFromISR()函数发送任务通知时,没有立即启动任务调度,导致要等到下一个系统节拍xPortSysTickHandler()中切换到另外一个任务才去获取任务通知,导致有时下一个任务通知过来了上一次的还没取走。
知道了原因解决起来就简单了,在使用xTaskNotifyFromISR()函数发送任务通知时,启动一次任务调度即可。
代码如下
void set_event_info(uint32_t val)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
BaseType_t ret;
ret = xTaskNotifyFromISR((TaskHandle_t )EventGroupTask_Handler,//接收任务通知的任务句柄
(uint32_t )val, //要更新的bit
(eNotifyAction )eSetBits,
&xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //启动一次任务切换,确保任务通知被获取
}