【FreeRTOS】在中断服务函数中使用系统延时函数vTaskDelay导致看门狗复位
【问题】
控制程序工作一段时间异常重启
【分析】
经定位分析重启原因为看门狗复位导致
【解决】
经排查发现在中断服务函数中使用了FreeRTOS的系统时延函数vTaskDelay,调试发现进入vTaskDelay函数后,会在函数xTaskResumeAll中进入临界段函数,
进而发现程序会卡死在下面代码处:
1 if ( uxCriticalNesting == 1) 2 { 3 configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); 4 }
上边代码表示发生一次嵌套调用时,会断言检查是否是中断调用,因为vTaskDelay不支持中断调用,所以结果就会死在此断言语句处
【结论】
中断函数中要避免使用时延函数,更不能使用系统时延函数
再牛逼的梦想也架不住傻逼似的坚持