RTOS 除錯 是做什麼的?
概述
使用此技能除錯 RTOS 問題,方法是分離排程器狀態、任務堆疊健康度、同步、中斷優先權、時序和資源所有權。從可觀察的 RTOS 狀態開始,再變更優先權或加入延遲。
使用時機
請在以下情況使用此技能:
- 韌體使用 FreeRTOS、RT-Thread、Zephyr、ThreadX、CMSIS-RTOS 或其他嵌入式排程器。
- 使用者回報死結、任務餓死、錯過事件、佇列逾時、堆疊溢位、看門狗重置、優先權反轉或任務未執行。
- 問題涉及 ISR 到任務的信號傳遞、計時器、信號量、互斥鎖、訊息佇列或任務通知。
在確認目標已知可啟動並執行至少部分韌體之前,請勿使用此技能。若已識別出特定的 RTOS,建議優先使用 freertos-kernel-debug、zephyr-integration 或 rt-thread-integration 進行深入的 RTOS 專項除錯。
首要問題
詢問:
- RTOS 名稱/版本 與 MCU/SoC。
- 症狀及發生的時機。
- 任務清單,包含優先權、堆疊大小及主要職責。
- 是否啟用堆疊溢位檢查、執行時期統計、追蹤或執行緒感知功能。
- 涉及的中斷來源及其中斷優先權。
- 記錄檔、斷言、看門狗原因或除錯器任務檢視。
工作流程
-
確認排程器已啟動。 驗證系統已到達排程器啟動點,且至少有一個已知任務正在執行。
-
擷取任務狀態。 收集任務名稱、狀態、優先權、堆疊高水位標記、CPU/執行時期統計資料及封鎖的物件。
-
首先檢查堆疊與堆積。 堆疊溢位與堆積耗盡經常偽裝成隨機的 RTOS 故障。
-
檢查同步機制。 找出哪個任務擁有每個互斥鎖、哪個佇列已滿/已空,以及是否從中斷中使用了 ISR 安全 API。
-
檢查中斷優先權規則。 確保 ISR 優先權對於 RTOS API 呼叫是合法的,且不會餓死排程器時脈中斷。
-
用探針取代猜測。 使用追蹤鉤子、斷言、水位標記、計數器或事件記錄,而不是加入任意的延遲。
檢查事項
- 每個任務的堆疊高水位標記。
- 堆積剩餘量/歷來最小剩餘量。
- 時脈中斷以預期頻率執行。
- 看門狗餵食任務未被餓死。
- 互斥鎖所有權及遞迴/非遞迴不匹配。
- 佇列長度、項目大小、發送/接收逾時。
- ISR 在必要處使用正確的
FromISRAPI。 - 臨界區段短且有界限。
- 在使用共享資源處存在優先權反轉保護。
驗證
在聲稱 RTOS 有進展之前:
- 說明 RTOS 狀態、排程器狀態、任務狀態及堆疊/堆積證據。
- 找出被封鎖或餓死的任務及其等待的物件。
- 說明中斷優先權對 RTOS API 使用是否合法。
- 回報任何斷言、看門狗或堆疊溢位鉤子的證據。
常見失敗
- 在不知道任務為何被封鎖的情況下提高其優先權。
- 加入延遲來隱藏競爭條件。
- 從中斷中呼叫非 ISR 安全的 API。
- 忽略堆疊高水位標記。
- 在確認佇列項目大小與所有權之前,就除錯佇列負載。
範例
使用者:
FreeRTOS 有個任務偶爾不跑,最後看門狗復位。
代理:
- 要求提供任務清單、優先權、堆疊大小、看門狗擁有者及任務狀態。
- 檢查高水位標記、堆積、時脈及被封鎖的物件。
- 在建議變更優先權之前,驗證 ISR 優先權及佇列/互斥鎖的所有權。