一、 簡介
在使用 S32K144 基於 FreeRTOS 同時初始化兩路 CAN 時,初始化第二路 CAN 時會出現進入 DefaultISR 的異常,本文將對該問題進行分析。
二、S32K144 FreeRTOS DefaultISR 異常分析
1. 在 ARM Cortex-M 系列 MCU 中,LR(Link Register,連結暫存器)是一個核心暫存器(通常為 R14),主要用於儲存函式或異常處理後的返回位址。當發生異常(如中斷)時,處理器會將異常返回位址存入 LR,並根據異常類型將 LR 設置為特殊值,以指示返回時的模式和堆疊指標。
2. 當進入 DefaultISR 時,查看通用暫存器,如圖 2 所示,其中 LR 的值為 0xFFFFFFFD,其低 4 位編碼 0xD 表示其使用進程堆疊指標(PSP),而 PSP 的值為 0x2000FD0。堆疊框架中包含返回地址,返回地址是中斷程序的下一條指令的地址,如圖 3 所示,此值在異常返回時會恢復到 PC,以便中斷程序恢復,從而可以得知異常進入的位置。
3. 通過 Memory 查找 PSP 位址,如圖 4 所示,其第 7 個 32 字節資料 0x0000583A 即為返回時恢復的 PC 位址。
4. 在反組譯(Disassembly)中查詢 0x0000583A 地址,如圖 5 所示,由此可知其在 FLEXCAN_DRV_InstallEventCallback 函式返回時,出現 DefaultISR 異常,但無法找到為什麼在函式返回時會發生異常。
5. 查看 FreeRTOS 的堆疊使用情況,當調試出現 DefaultISR 時,在 S32DS 的 FreeRTOS->Heap usage,如圖 6 所示,其佔用達到 98.24%,懷疑堆疊溢出。透過 FreeRTOS 元件的 Memory 模組,將 Heap 大小由 8KB 修改為 16KB,如圖 7 所示,編譯後重新調試,調試使用兩路 CAN 未出現 DefaultISR,程式運行正常。
三、 參考文獻
Cortex-M4 Devices Generic User Guide.pdf.pdf
評論