起因
最近在有一个项目因为任务比较多,就上了freertos,但是在我接收串口数据后,使用xTaskResumeFromISR函数,进入一个更高优先级的任务时,死活进不去。
问题描述
在运行一个优先级为5的任务,这个时候串口有数据传给单片机,进入中断接收数据,并使用xTaskResumeFromISR恢复一个优先级为6的任务,使数据写入内部flash。这个时候,恢复的任务优先级为6,原本在运行的任务优先级为5,应该优先执行优先级为6的任务,但单片机不这么执行。
解决方法
如果函数xTaskResumeFromISR()返回值为pdTRUE,那么说明要恢复的这个任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),所以在退出中断的时候一定要进行上下文切换!
void USART3_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart3);
BaseType_t YieldRequired;
if(usart3_buf[0]=='a' && usart3_buf[1]=='b' && usart3_buf[2]=='c')
{
YieldRequired = xTaskResumeFromISR(WriteFlashHandler);
if(YieldRequired = pdTRUE)
{
portYIELD_FROM_ISR(YieldRequired);
}
}
}