0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

三分鐘搞定MCU內(nèi)存溢出

痞子衡嵌入式 ? 來(lái)源:痞子衡嵌入式 ? 2023-03-26 10:07 ? 次閱讀

今天我來(lái)講一講MCU開(kāi)發(fā)中的一個(gè)棘手問(wèn)題——內(nèi)存溢出,希望能幫到遇到該問(wèn)題的同學(xué)們。

開(kāi)發(fā)環(huán)境

SDK版本:SDK_2_6_13_FRDM-KW38

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

開(kāi)發(fā)板:FRDM-KW38

IDE:IAR EmbeddedWorkbench for Arm version 8.50

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

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

FreeRTOS RAM

CSTACK

動(dòng)態(tài)內(nèi)存分配

FreeRTOS RAM分析

因?yàn)槲覀兪褂玫氖菐?a href="http://srfitnesspt.com/tags/RTOS/" target="_blank">RTOS的工程,所以這里先介紹一下FreeRTOS里stack和heap的管理和分析。

Task Stack分析

每個(gè)task的stack是獨(dú)立分配的,我們使用IAR的FreeRTOS分析插件對(duì)stack進(jìn)行分析,打開(kāi)和使能方式如下:

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

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

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

以上方式針對(duì)的是在線debug時(shí)的分析查看,該方式查看信息較全面,可以在開(kāi)發(fā)階段根據(jù)多數(shù)場(chǎng)景分配合適的stack,但是對(duì)于debugger離線后的溢出檢測(cè)則需要使用FreeRTOS自帶的stack異常檢測(cè)工具,打開(kāi)方式如下,詳細(xì)信息請(qǐng)參考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通過(guò)如下宏定義,對(duì)于該Heap的溢出檢測(cè)可以使用FreeRTOS自帶的內(nèi)存分配失敗鉤子函數(shù)進(jìn)行檢測(cè)。

#define gTotalHeapSize_c        9000

#define configUSE_MALLOC_FAILED_HOOK 1

CSTACK分析

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

IAR本身集成了CSTACK檢測(cè)功能,會(huì)顯示當(dāng)前棧的使用情況和最大棧深度,開(kāi)發(fā)階段連接debugger,按如下方式設(shè)置后即可查看CSTACK信息。

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

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

如果系統(tǒng)產(chǎn)生了CSTACK溢出,我們?cè)撊绾螜z測(cè)哪里產(chǎn)生了這個(gè)溢出呢?這時(shí)我們可以使用IAR的數(shù)據(jù)斷點(diǎn)功能,將棧底位置寫(xiě)入數(shù)據(jù)斷點(diǎn)的break位置,Access type改為Write,這樣只要棧底被修改了,即可產(chǎn)生斷點(diǎn),根據(jù)代碼break的位置,即可知道是哪里產(chǎn)生了CSTACK溢出。

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

一個(gè)快速獲得棧底位置的方法,如下圖所示,將鼠標(biāo)放到IAR的CSTACK的進(jìn)度條處即可顯示stack的使用范圍。

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

對(duì)于debugger離線后的CSTACK溢出檢測(cè),我們可以通過(guò)初始化棧空間為一個(gè)固定值,例如在線分析時(shí)為0xcd,定時(shí)檢測(cè)棧底上的該值是否有被修改來(lái)檢測(cè)。

如下所示為在idle任務(wù)中進(jìn)入低功耗前增加棧底數(shù)據(jù)的檢測(cè)。

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__;

動(dòng)態(tài)內(nèi)存分配

SDK沒(méi)有使用標(biāo)準(zhǔn)庫(kù)的malloc函數(shù),定義__heap_size__為0,所以用戶不能使用malloc和free函數(shù)。但如果需要?jiǎng)討B(tài)申請(qǐng)內(nèi)存該如何操作呢?SDK的Framework里定義了一套簡(jiǎn)化的內(nèi)存管理函數(shù)MEM_BufferAlloc()和MEM_BufferFree()。

配置文件中需要預(yù)先定義需要的數(shù)據(jù)塊大小和數(shù)量,內(nèi)存申請(qǐng)單元會(huì)從這些內(nèi)存塊中選取滿足大小要求的最小的數(shù)據(jù)塊作為MEM_BufferAlloc()的返回結(jié)果。

#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_

當(dāng)然如果用戶使用了該內(nèi)存分配方法,則需要根據(jù)應(yīng)用情況,對(duì)應(yīng)地增加內(nèi)存池中的系數(shù)。另外可以使能如下宏定義,查看分析內(nèi)存分配是否合理,具體用法請(qǐng)參考應(yīng)用筆記:

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

MEM_DEBUG,MEM_TRACKING,MEM_DEBUG_OUT_OF_MEMORY

以上是我總結(jié)的一些overflow的應(yīng)對(duì)策略,強(qiáng)烈建議大家在開(kāi)發(fā)階段加上這些檢測(cè)措施,因?yàn)閮?nèi)存溢出會(huì)導(dǎo)致各種意想不到的結(jié)果,如果只跟著看到的異?,F(xiàn)象分析,往往會(huì)浪費(fèi)很多不必要的時(shí)間和精力,如果大家有其它應(yīng)對(duì)內(nèi)存溢出的方法,歡迎一起討論學(xué)習(xí)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16802

    瀏覽量

    349371
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2947

    瀏覽量

    73733
  • RTOS
    +關(guān)注

    關(guān)注

    21

    文章

    808

    瀏覽量

    119296
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1015

    瀏覽量

    45608
  • 內(nèi)存溢出
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    1187

原文標(biāo)題:三分鐘搞定MCU內(nèi)存溢出

文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    免費(fèi)三分鐘

    免費(fèi)三分鐘回?fù)茈娫?,綠色的,對(duì)號(hào)碼有次數(shù)限制.有三分鐘通話時(shí)長(zhǎng),,反其道而行不就又是三分鐘,請(qǐng)各位靈活運(yùn)用(見(jiàn)例)假如我的電話是1301309****,而我要打的電話是1386551****.把
    發(fā)表于 03-02 17:27

    三分鐘搞定NFC

    種方式。沒(méi)有規(guī)定數(shù)據(jù)的加密處理方式。NFC標(biāo)準(zhǔn)與索尼開(kāi)發(fā)的“FeliCa”以及荷蘭恩智浦半導(dǎo)體(NXP Semiconductors)的“Mifare”所采用的非接觸式IC卡技術(shù),在物理層上具有兼容性
    發(fā)表于 07-13 15:11

    職場(chǎng)啟示: 三分鐘碎片化

    也無(wú)法寫(xiě)好。 明白這一點(diǎn),你就會(huì)意識(shí)到,有些工作的確需要大塊的時(shí)間,但如果不是提前做夠鋪墊,這些大塊的時(shí)間并不會(huì)有效率。 所以我自己的習(xí)慣是“五分鐘方案法”。也就是說(shuō): 一份完整的方案=5分鐘構(gòu)思
    發(fā)表于 08-07 14:06

    讓程序運(yùn)行三分鐘,停一分鐘,循環(huán)下去,直到設(shè)置停止循環(huán)的位置

    本帖最后由 我想看看太陽(yáng) 于 2022-6-9 11:52 編輯 讓這個(gè)程序運(yùn)行三分鐘,停一分鐘,循環(huán)下去,直到設(shè)置停止循環(huán)的位置,需要添加什么模塊才能實(shí)現(xiàn)呢
    發(fā)表于 06-08 15:03

    三分鐘讓你明白電池為什么會(huì)鼓包

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

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

    蘋(píng)果系統(tǒng)是以穩(wěn)定著稱,不過(guò)這位網(wǎng)友發(fā)來(lái)求助,稱自己的iPhone6s三分鐘時(shí)間重啟了N次。并且拍了視頻,系統(tǒng)為IOS10.2.1。
    發(fā)表于 02-25 10:18 ?2552次閱讀

    小米掃地機(jī)器人臺(tái)灣開(kāi)售 三分鐘售罄

    首批小米掃地機(jī)器人于4月6日如約在臺(tái)灣地區(qū)開(kāi)售,售價(jià)8895臺(tái)幣(約合1915元人民幣),開(kāi)售三分鐘,5000臺(tái)掃地機(jī)器人在小米臺(tái)灣官網(wǎng)即告售罄。
    發(fā)表于 04-07 10:45 ?1221次閱讀

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

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

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

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

    Brocade幫助Netzlink實(shí)現(xiàn)三分鐘云服務(wù)供應(yīng)

    電子發(fā)燒友網(wǎng)站提供《Brocade幫助Netzlink實(shí)現(xiàn)三分鐘云服務(wù)供應(yīng).pdf》資料免費(fèi)下載
    發(fā)表于 08-29 10:12 ?0次下載
    Brocade幫助Netzlink實(shí)現(xiàn)<b class='flag-5'>三分鐘</b>云服務(wù)供應(yīng)

    快樂(lè)解說(shuō)MCU三分鐘,帶你了解低功耗MCU

    快樂(lè)解說(shuō)MCU三分鐘,帶你了解低功耗MCU
    的頭像 發(fā)表于 09-18 10:56 ?1230次閱讀

    三分鐘實(shí)現(xiàn)MQTT協(xié)議網(wǎng)關(guān)串口連接菱FX3UPLC上傳騰訊云

    三分鐘實(shí)現(xiàn)MQTT協(xié)議網(wǎng)關(guān)串口連接菱FX3UPLC上傳騰訊云
    的頭像 發(fā)表于 10-23 16:23 ?926次閱讀
    <b class='flag-5'>三分鐘</b>實(shí)現(xiàn)MQTT協(xié)議網(wǎng)關(guān)串口連接<b class='flag-5'>三</b>菱FX3UPLC上傳騰訊云

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

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

    三分鐘了解飛創(chuàng)直線電機(jī)運(yùn)動(dòng)模組特點(diǎn)、選型及應(yīng)用-FCL系列

    三分鐘了解飛創(chuàng)直線電機(jī)運(yùn)動(dòng)模組特點(diǎn)、選型及應(yīng)用-FCL系列
    的頭像 發(fā)表于 02-05 16:28 ?505次閱讀
    <b class='flag-5'>三分鐘</b>了解飛創(chuàng)直線電機(jī)運(yùn)動(dòng)模組特點(diǎn)、選型及應(yīng)用-FCL系列

    Node-RED初學(xué)者教程-三分鐘學(xué)習(xí)

    通過(guò)這短短三分鐘的教程,你已經(jīng)掌握了Node-RED的基本操作。你可以利用Node-RED的強(qiáng)大功能來(lái)創(chuàng)建更復(fù)雜的數(shù)據(jù)流和自動(dòng)化任務(wù),無(wú)論是物聯(lián)網(wǎng)應(yīng)用、API集成還是數(shù)據(jù)處理。Node-RED簡(jiǎn)化了編程過(guò)程,讓開(kāi)發(fā)更直觀、更高效。繼續(xù)探索Node-RED,你會(huì)發(fā)現(xiàn)更多強(qiáng)大且有趣的功能。
    的頭像 發(fā)表于 06-27 17:09 ?1956次閱讀
    Node-RED初學(xué)者教程-<b class='flag-5'>三分鐘</b>學(xué)習(xí)