精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

三分鐘搞定MCU內存溢出

痞子衡嵌入式 ? 來源:痞子衡嵌入式 ? 2023-03-26 10:07 ? 次閱讀

今天我來講一講MCU開發中的一個棘手問題——內存溢出,希望能幫到遇到該問題的同學們。

開發環境

SDK版本:SDK_2_6_13_FRDM-KW38

SDK下載地址:https://mcuxpresso.nxp.com

開發板:FRDM-KW38

IDE:IAR EmbeddedWorkbench for Arm version 8.50

演示代碼:https://github.com/N40E116/SDK_2_6_13_FRDM-KW38.git

本文總結了如下三類RAM使用情況的分析:

FreeRTOS RAM

CSTACK

動態內存分配

FreeRTOS RAM分析

因為我們使用的是帶RTOS的工程,所以這里先介紹一下FreeRTOS里stack和heap的管理和分析。

Task Stack分析

每個task的stack是獨立分配的,我們使用IAR的FreeRTOS分析插件對stack進行分析,打開和使能方式如下:

543983e4-cac8-11ed-bfe3-dac502259ad0.png

54501172-cac8-11ed-bfe3-dac502259ad0.png

5465c684-cac8-11ed-bfe3-dac502259ad0.png

以上方式針對的是在線debug時的分析查看,該方式查看信息較全面,可以在開發階段根據多數場景分配合適的stack,但是對于debugger離線后的溢出檢測則需要使用FreeRTOS自帶的stack異常檢測工具,打開方式如下,詳細信息請參考FreeRTOS- stacks and stack overflow checking

#define configCHECK_FOR_STACK_OVERFLOW 2

#if (configCHECK_FOR_STACK_OVERFLOW !=  0)
void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName)
{
    panic(0,(uint32_t)vApplicationStackOverflowHook,0,0);
}
#endif

FreeRTOS Heap分析

FreeRTOS使用的heap通過如下宏定義,對于該Heap的溢出檢測可以使用FreeRTOS自帶的內存分配失敗鉤子函數進行檢測。

#define gTotalHeapSize_c        9000

#define configUSE_MALLOC_FAILED_HOOK 1

CSTACK分析

上面章節我們講了FreeRTOS中task占用stack的檢測方法,但是對于RTOS初始化前和中斷處理函數中用到的CSTACK該如何檢測呢?

IAR本身集成了CSTACK檢測功能,會顯示當前棧的使用情況和最大棧深度,開發階段連接debugger,按如下方式設置后即可查看CSTACK信息。

5478bc8a-cac8-11ed-bfe3-dac502259ad0.png

54999c02-cac8-11ed-bfe3-dac502259ad0.png

如果系統產生了CSTACK溢出,我們該如何檢測哪里產生了這個溢出呢?這時我們可以使用IAR的數據斷點功能,將棧底位置寫入數據斷點的break位置,Access type改為Write,這樣只要棧底被修改了,即可產生斷點,根據代碼break的位置,即可知道是哪里產生了CSTACK溢出。

54bab8ce-cac8-11ed-bfe3-dac502259ad0.png

一個快速獲得棧底位置的方法,如下圖所示,將鼠標放到IAR的CSTACK的進度條處即可顯示stack的使用范圍。

54d379ea-cac8-11ed-bfe3-dac502259ad0.png

對于debugger離線后的CSTACK溢出檢測,我們可以通過初始化棧空間為一個固定值,例如在線分析時為0xcd,定時檢測棧底上的該值是否有被修改來檢測。

如下所示為在idle任務中進入低功耗前增加棧底數據的檢測。

void check_overflow_cstack()
{
    extern uint32_t CHECK_OVERFLOW_CSTACK_SIZE[];
    uint32_t CHECK_OVERFLOW_CSTACK_END = *((uint32_t*)0UL) - (uint32_t)CHECK_OVERFLOW_CSTACK_SIZE;
    if(*(uint32_t*)CHECK_OVERFLOW_CSTACK_END != 0xcdcdcdcd)
    {
        panic(0,(uint32_t)check_overflow_cstack,0,0);
    }
}

void BOARD_EnterLowPowerCb(void)
{
    check_overflow_cstack();
…
}

另外鏈接文件MKW38A512xxx4_PD_connectivity_lp.icf需要增加如下定義:

define exported symbol  CHECK_OVERFLOW_CSTACK_SIZE = __size_cstack__;

動態內存分配

SDK沒有使用標準庫的malloc函數,定義__heap_size__為0,所以用戶不能使用malloc和free函數。但如果需要動態申請內存該如何操作呢?SDK的Framework里定義了一套簡化的內存管理函數MEM_BufferAlloc()和MEM_BufferFree()。

配置文件中需要預先定義需要的數據塊大小和數量,內存申請單元會從這些內存塊中選取滿足大小要求的最小的數據塊作為MEM_BufferAlloc()的返回結果。

#define AppPoolsDetails_c 
         _block_size_  80  _number_of_blocks_    7 _eol_  
         _block_size_ 248   _number_of_blocks_   2 _eol_  
         _block_size_ 312  _number_of_blocks_    1 _eol_  
         _block_size_ 392  _number_of_blocks_    1 _eol_

當然如果用戶使用了該內存分配方法,則需要根據應用情況,對應地增加內存池中的系數。另外可以使能如下宏定義,查看分析內存分配是否合理,具體用法請參考應用筆記:

MemoryPool Optimizer on MKW3xA/KW3xZ (nxp.com.cn)。

MEM_DEBUG,MEM_TRACKING,MEM_DEBUG_OUT_OF_MEMORY

以上是我總結的一些overflow的應對策略,強烈建議大家在開發階段加上這些檢測措施,因為內存溢出會導致各種意想不到的結果,如果只跟著看到的異常現象分析,往往會浪費很多不必要的時間和精力,如果大家有其它應對內存溢出的方法,歡迎一起討論學習。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17019

    瀏覽量

    350375
  • 內存
    +關注

    關注

    8

    文章

    3004

    瀏覽量

    73900
  • RTOS
    +關注

    關注

    22

    文章

    809

    瀏覽量

    119454
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1029

    瀏覽量

    45782
  • 內存溢出
    +關注

    關注

    0

    文章

    10

    瀏覽量

    1193

原文標題:三分鐘搞定MCU內存溢出

文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    免費三分鐘

    免費三分鐘回撥電話,,綠色的,對號碼有次數限制.有三分鐘通話時長,,反其道而行不就又是三分鐘,請各位靈活運用(見例)假如我的電話是1301309****,而我要打的電話是1386551****.把
    發表于 03-02 17:27

    三分鐘搞定NFC

    種方式。沒有規定數據的加密處理方式。NFC標準與索尼開發的“FeliCa”以及荷蘭恩智浦半導體(NXP Semiconductors)的“Mifare”所采用的非接觸式IC卡技術,在物理層上具有兼容性
    發表于 07-13 15:11

    職場啟示: 三分鐘碎片化

    也無法寫好。 明白這一點,你就會意識到,有些工作的確需要大塊的時間,但如果不是提前做夠鋪墊,這些大塊的時間并不會有效率。 所以我自己的習慣是“五分鐘方案法”。也就是說: 一份完整的方案=5分鐘構思
    發表于 08-07 14:06

    讓程序運行三分鐘,停一分鐘,循環下去,直到設置停止循環的位置

    本帖最后由 我想看看太陽 于 2022-6-9 11:52 編輯 讓這個程序運行三分鐘,停一分鐘,循環下去,直到設置停止循環的位置,需要添加什么模塊才能實現呢
    發表于 06-08 15:03

    三分鐘讓你明白電池為什么會鼓包

    三分鐘讓你明白電
    發表于 11-12 08:18 ?7.1w次閱讀

    三分鐘能做什么?三分鐘能讓我的iPhone6s重啟N次!

    蘋果系統是以穩定著稱,不過這位網友發來求助,稱自己的iPhone6s三分鐘時間重啟了N次。并且拍了視頻,系統為IOS10.2.1。
    發表于 02-25 10:18 ?2570次閱讀

    小米掃地機器人臺灣開售 三分鐘售罄

    首批小米掃地機器人于4月6日如約在臺灣地區開售,售價8895臺幣(約合1915元人民幣),開售三分鐘,5000臺掃地機器人在小米臺灣官網即告售罄。
    發表于 04-07 10:45 ?1229次閱讀

    三分鐘概述8類常用元器件資料下載

    電子發燒友網為你提供三分鐘概述8類常用元器件資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 03-28 08:40 ?6次下載
    <b class='flag-5'>三分鐘</b>概述8類常用元器件資料下載

    三分鐘看懂工字型功率電感外觀破損的常見原因gujing

    三分鐘看懂工字型功率電感外觀破損的常見原因gujing? 編輯:谷景電子 關于功率電感的相關問題最近給大家做了一些小科普,有關注選型的、有關于性能特點方面、以及有關于如何解決功率電感使用中溫升高
    發表于 11-09 13:54 ?816次閱讀
    <b class='flag-5'>三分鐘</b>看懂工字型功率電感外觀破損的常見原因gujing

    Brocade幫助Netzlink實現三分鐘云服務供應

    電子發燒友網站提供《Brocade幫助Netzlink實現三分鐘云服務供應.pdf》資料免費下載
    發表于 08-29 10:12 ?0次下載
    Brocade幫助Netzlink實現<b class='flag-5'>三分鐘</b>云服務供應

    快樂解說MCU三分鐘,帶你了解低功耗MCU

    快樂解說MCU三分鐘,帶你了解低功耗MCU
    的頭像 發表于 09-18 10:56 ?1306次閱讀

    三分鐘實現MQTT協議網關串口連接菱FX3UPLC上傳騰訊云

    三分鐘實現MQTT協議網關串口連接菱FX3UPLC上傳騰訊云
    的頭像 發表于 10-23 16:23 ?980次閱讀
    <b class='flag-5'>三分鐘</b>實現MQTT協議網關串口連接<b class='flag-5'>三</b>菱FX3UPLC上傳騰訊云

    三分鐘看懂雪崩光電二極管

    三分鐘看懂雪崩光電二極管
    的頭像 發表于 11-23 09:09 ?1852次閱讀
    <b class='flag-5'>三分鐘</b>看懂雪崩光電二極管

    三分鐘了解飛創直線電機運動模組特點、選型及應用-FCL系列

    三分鐘了解飛創直線電機運動模組特點、選型及應用-FCL系列
    的頭像 發表于 02-05 16:28 ?567次閱讀
    <b class='flag-5'>三分鐘</b>了解飛創直線電機運動模組特點、選型及應用-FCL系列

    Node-RED初學者教程-三分鐘學習

    通過這短短三分鐘的教程,你已經掌握了Node-RED的基本操作。你可以利用Node-RED的強大功能來創建更復雜的數據流和自動化任務,無論是物聯網應用、API集成還是數據處理。Node-RED簡化了編程過程,讓開發更直觀、更高效。繼續探索Node-RED,你會發現更多強大且有趣的功能。
    的頭像 發表于 06-27 17:09 ?2486次閱讀
    Node-RED初學者教程-<b class='flag-5'>三分鐘</b>學習