一、 簡介
《NXP S32K144 FreeRTOS DefaultISR 異常分析》中介紹了 S32K144 運行 FreeRTOS DefaultISR 的問題,原因是由於 FreeRTOS 堆積區(Heap)溢出。將 Heap 大小改為 16KB 後問題得以解決,但後來需要將 FreeRTOS Heap 大小設置為 32KB,在進行編譯時出現了堆疊溢出的錯誤,如圖 1 所示。
二、S32K144 FreeRTOS Heap 大小配置異常分析
1. 查看 S32K144 的 RAM,其分為 SRAM_L 和 SRAM_U,大小分別為 32KB(1FFF_8000~1FFF_FFFF)和 28KB(2000_0000~2000_6FFF),如圖 2 所示。要給 FreeRTOS 的 Heap 分配 32KB,只能將 32KB 的 SRAM_L 用於單獨存放 FreeRTOS 的 Heap,因此需將分配到 SRAM_L 的資料改為分配到 SRAM_U,將 SRAM_L 的 32KB 空出來專門用於存放 FreeRTOS 的 Heap。
2. 在 S32K144 專案的 LD 文件中,需要將所有分配給 m_data(即 SRAM_L)的段改為分配到 m_data_2,以便釋放 m_data 的空間,用於存放 FreeRTOS Heap,如圖 3 所示。
3. 在 LD 檔案中新建一個段落用於存放 FreeRTOS 的 Heap,並分配給 m_data。
.my_section :
{
. = ALIGN(4); /* 4字節對齊 */
*(.my_section) /* 收集所有 .my_section 段的變數 */
. = ALIGN(4);
} > m_data /* 分配段到 RAM */
4. 使用 attribute 語句將 FreeRTOS 的 Heap 指定存放到新建的段中,如圖 4 所示。
5. 在 FreeRTOS 元件的 Memory 模組中將 Heap 大小設定為 32KB,即可設定成功,編譯正常。
評論