NXP S32K144 FreeRTOS 堆積大小配置異常分析

關鍵字 :NXPS32K144FreeRTOSHeap

一、 簡介

        《NXP S32K144 FreeRTOS DefaultISR 異常分析》中介紹了 S32K144 運行 FreeRTOS DefaultISR 的問題,原因是由於 FreeRTOS 堆積區(Heap)溢出。將 Heap 大小改為 16KB 後問題得以解決,但後來需要將 FreeRTOS Heap 大小設置為 32KB,在進行編譯時出現了堆疊溢出的錯誤,如圖 1 所示。

圖 1 FreeRTOS Heap 設為 32KB 時編譯堆疊溢出錯誤

 

二、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 S32K1 記憶體

 

2. 在 S32K144 專案的 LD 文件中,需要將所有分配給 m_data(即 SRAM_L)的段改為分配到 m_data_2,以便釋放 m_data 的空間,用於存放 FreeRTOS Heap,如圖 3 所示。

圖 3 LD 檔案段存放地址修改

 

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 所示。

圖 4 使用 attribute 語句指定 FreeRTOS Heap 的存放地址

 

5. 在 FreeRTOS 元件的 Memory 模組中將 Heap 大小設定為 32KB,即可設定成功,編譯正常。

圖 5 FreeRTOS Heap 大小配置

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

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

參考來源

:

評論