NXP S32K144 FreeRTOS DefaultISR 異常分析

關鍵字 :NXPFreeRTOSDefaultISR

一、 簡介

在使用 S32K144 基於 FreeRTOS 同時初始化兩路 CAN 時,初始化第二路 CAN 時會出現進入 DefaultISR 的異常,本文將對該問題進行分析。

圖 1 調試進入 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,以便中斷程序恢復,從而可以得知異常進入的位置。

圖 2 LR 以及 PSP 值

 

圖 3 堆疊框架

 

3. 通過 Memory 查找 PSP 位址,如圖 4 所示,其第 7 個 32 字節資料 0x0000583A 即為返回時恢復的 PC 位址。

圖 4 堆疊框架中返回時恢復的 PC 位址

 

4. 在反組譯(Disassembly)中查詢 0x0000583A 地址,如圖 5 所示,由此可知其在 FLEXCAN_DRV_InstallEventCallback 函式返回時,出現 DefaultISR 異常,但無法找到為什麼在函式返回時會發生異常。

圖 5 DefaultISR 發生前的位置

 

5. 查看 FreeRTOS 的堆疊使用情況,當調試出現 DefaultISR 時,在 S32DS 的 FreeRTOS->Heap usage,如圖 6 所示,其佔用達到 98.24%,懷疑堆疊溢出。透過 FreeRTOS 元件的 Memory 模組,將 Heap 大小由 8KB 修改為 16KB,如圖 7 所示,編譯後重新調試,調試使用兩路 CAN 未出現 DefaultISR,程式運行正常。

圖 6 FreeRTOS 記憶體堆使用情況

 

圖 7 FreeRTOS 元件配置

 

三、 參考文獻

Cortex-M4 Devices Generic User Guide.pdf.pdf

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

:

評論