FreeRTOS 列印任務執行情況 進硬體錯誤中斷
阿新 • • 發佈:2022-03-01
學習FreeRTOS的時候,列印任務執行情況,發現每次都會進入硬體錯誤中斷 。
而硬體中斷一般是發生在堆疊溢位,陣列越界等情況。
開始一步步分析錯誤位置:
1,發現註釋掉列印部分,則不會出現錯誤,則錯誤出現在列印部分
printf("=================================================\r\n");
printf("TaskName Status Priority Stack Index \r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\nTaskName RunTimes CPU\r\n");
vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
2,感覺作業系統部分應該不會有問題,於是註釋掉作業系統函式
printf("=================================================\r\n");
printf("TaskName Status Priority Stack Index \r\n");
//vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\nTaskName RunTimes CPU\r\n");
//vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
但是,註釋掉作業系統函式後,發現不進硬體中斷了,所有問題出在註釋掉的這兩個函式裡面。
3,進入vTaskList裡面,發現有這樣的語句:
sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber );
使用sprint函式把任務資訊儲存到陣列pcWriteBuffer裡,單步執行到這裡,就出現了錯誤。可以定位問題出現在了這裡。在繼續檢視pcWriteBuffer是在任務函式裡面定義的
uint8_t pcWriteBuffer[64];,
對應這個陣列,有兩個可能出錯的地方:
(1)首先這個陣列定義太小了,可能會導致sprintf呼叫的時候就陣列溢位
(2)在函式內部定義的變數是儲存在函式堆疊裡的,不能定義很大的陣列。
把這個陣列定義放在全域性變數裡面,同時長度定義到300。測試發現不再進硬體錯誤中斷了。