@2019-04-09
【問題】
控制程序工作一段時間異常重啟
【分析】
經定位分析重啟原因為看門狗復位導致
【解決】
經排查發現在中斷服務函數中使用了FreeRTOS的系統時延函數vTaskDelay,調試發現進入vTaskDelay函數后,會在函數xTaskResumeAll中進入臨界段函數,
進而發現程序會卡死在下面代碼處:
1 if ( uxCriticalNesting == 1) 2 { 3 configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); 4 }
上邊代碼表示發生一次嵌套調用時,會斷言檢查是否是中斷調用,因為vTaskDelay不支持中斷調用,所以結果就會死在此斷言語句處
【結論】
中斷函數中要避免使用時延函數,更不能使用系統時延函數