在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

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

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

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

SDK版本:SDK_2_6_13_FRDM-KW38

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

開發(fā)板: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

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

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時的分析查看,該方式查看信息較全面,可以在開發(fā)階段根據(jù)多數(shù)場景分配合適的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自帶的內(nèi)存分配失敗鉤子函數(shù)進行檢測。

#define gTotalHeapSize_c        9000

#define configUSE_MALLOC_FAILED_HOOK 1

CSTACK分析

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

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

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

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

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

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

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

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

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

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

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

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

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

配置文件中需要預先定義需要的數(shù)據(jù)塊大小和數(shù)量,內(nèi)存申請單元會從這些內(nèi)存塊中選取滿足大小要求的最小的數(shù)據(jù)塊作為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_

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

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

MEM_DEBUG,MEM_TRACKING,MEM_DEBUG_OUT_OF_MEMORY

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

審核編輯:湯梓紅

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

    關注

    146

    文章

    17880

    瀏覽量

    361417
  • 內(nèi)存
    +關注

    關注

    8

    文章

    3111

    瀏覽量

    75041
  • RTOS
    +關注

    關注

    24

    文章

    844

    瀏覽量

    120846
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1067

    瀏覽量

    47810
  • 內(nèi)存溢出

    關注

    0

    文章

    10

    瀏覽量

    1322

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    免費三分鐘

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

    三分鐘搞定NFC

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

    職場啟示: 三分鐘碎片化

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

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

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

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

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

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

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

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

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

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

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

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

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

    Brocade幫助Netzlink實現(xiàn)三分鐘云服務供應

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

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

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

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

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

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

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

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

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

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

    通過這短短三分鐘的教程,你已經(jīng)掌握了Node-RED的基本操作。你可以利用Node-RED的強大功能來創(chuàng)建更復雜的數(shù)據(jù)流和自動化任務,無論是物聯(lián)網(wǎng)應用、API集成還是數(shù)據(jù)處理。Node-RED簡化了編程過程,讓開發(fā)更直觀、更高效。繼續(xù)探索Node-RED,你會發(fā)現(xiàn)更多強大且有趣的功能。
    的頭像 發(fā)表于 06-27 17:09 ?5091次閱讀
    Node-RED初學者教程-<b class='flag-5'>三分鐘</b>學習
    主站蜘蛛池模板: 久久99热精品 | 欧美性色黄大片四虎影视 | 国产三级视频在线播放 | 午夜高清在线 | 日本高清色视频www 日本高清色视频在线观看免费 | 激情性爽三级成人 | 91国内在线 | 18美女扒开尿口无遮挡 | 国产成人在线播放视频 | 国产一区二区三区不卡观 | 欧美 亚洲 国产 精品有声 | 国内黄色精品 | 午夜影视啪啪免费体验区入口 | 操美女免费视频 | 日日操夜夜爱 | 五月婷六月婷婷 | 人人狠狠综合88综合久久 | 人人做人人爽 | 天天爱天天操天天干 | www.色播| 亚洲精品第一 | 一区二区三区免费精品视频 | 色资源网| 免费视频一区二区 | 色视频免费观看高清完整 | 色偷偷女男人的天堂亚洲网 | 美女拍拍拍黄色 | 美女视频黄a视频美女大全 美女视频一区二区 | 玖玖爱这里只有精品 | 国产巨大bbbb天美 | 久久天天躁狠狠躁狠狠躁 | 97国内精品久久久久久久影视 | 777色淫网站女女免费 | 久久婷婷综合五月一区二区 | 国产精品一一在线观看 | 国产高清色播视频免费看 | 人人干干 | 很黄很色网站 | 国内精品视频 | 亚洲成综合人影院在院播放 | 欧美婷婷六月丁香综合色 |