FreeRTOS任务通知使用心得

FreeRTOS任务通知使用心得

  • 问题
  • 原因
  • 解决方法

参考博客: FreeRTOS任务通知.
参考博客: FreeRTOS实验一.

问题

在回调函数中使用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); //启动一次任务切换,确保任务通知被获取			
}

你可能感兴趣的:(FreeRTOS,freertos,c语言)