1. 程式人生 > 其它 >FreeRTOS 列印任務執行情況 進硬體錯誤中斷

FreeRTOS 列印任務執行情況 進硬體錯誤中斷

學習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。測試發現不再進硬體錯誤中斷了。