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

    文章

    16024

    浏览量

    343742
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72794
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118812
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44764
  • 内存溢出
    +关注

    关注

    0

    文章

    10

    浏览量

    1145

原文标题:三分钟搞定MCU内存溢出

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    免费三分钟

    免费三分钟回拨电话,,绿色的,对号码有次数限制.有三分钟通话时长,,反其道而行不就又是三分钟,请各位灵活运用(见例)假如我的电话是1301309****,而我要打的电话是1386551****.把
    发表于 03-02 17:27

    三分钟搞定NFC

    种方式。没有规定数据的加密处理方式。NFC标准与索尼开发的“FeliCa”以及荷兰恩智浦半导体(NXP Semiconductors)的“Mifare”所采用的非接触式IC卡技术,在物理层上具有兼容性
    发表于 07-13 15:11

    10分钟搞定pld

    10f分钟你绝对能搞定
    发表于 08-30 15:33

    职场启示: 三分钟碎片化

    也无法写好。 明白这一点,你就会意识到,有些工作的确需要大块的时间,但如果不是提前做够铺垫,这些大块的时间并不会有效率。 所以我自己的习惯是“五分钟方案法”。也就是说: 一份完整的方案=5分钟构思
    发表于 08-07 14:06

    清零怎么维持三分钟

    ,显示0.0要至少能维持3分钟,而且小数点后一位也要是0.我上面显示的0.1512最前面以为小数是1不符合要求。我想不出办法来了,请高手指点,如何才能达到要求。谢谢!​
    发表于 04-18 07:56

    电阻、感抗、容抗、阻抗三分钟理清它们的关系

    电阻、感抗、容抗、阻抗究竟谁是老大?三分钟理清它们的关系电感、电阻、电容电阻、感抗、容抗、阻抗四个名词活跃在各种电路中,它们是什么关系了?且听慢慢道来。一、电阻:这是我们最熟悉不过的东东了,在初中
    发表于 12-06 08:55

    让程序运行三分钟,停一分钟,循环下去,直到设置停止循环的位置

    本帖最后由 我想看看太阳 于 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 2462次阅读

    三分钟概述8类常用元器件资料下载

    电子发烧友网为你提供三分钟概述8类常用元器件资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 03-28 08:40 6次下载
    <b class='flag-5'>三分钟</b>概述8类常用元器件资料下载

    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 826次阅读

    三分钟实现MQTT协议网关串口连接三菱FX3UPLC上传腾讯云

    三分钟实现MQTT协议网关串口连接三菱FX3UPLC上传腾讯云
    的头像 发表于 10-23 16:23 560次阅读
    <b class='flag-5'>三分钟</b>实现MQTT协议网关串口连接三菱FX3UPLC上传腾讯云

    三分钟看懂雪崩光电二极管

    三分钟看懂雪崩光电二极管
    的头像 发表于 11-23 09:09 880次阅读
    <b class='flag-5'>三分钟</b>看懂雪崩光电二极管

    三分钟了解飞创直线电机运动模组特点、选型及应用-FCL系列

    三分钟了解飞创直线电机运动模组特点、选型及应用-FCL系列
    的头像 发表于 02-05 16:28 217次阅读
    <b class='flag-5'>三分钟</b>了解飞创直线电机运动模组特点、选型及应用-FCL系列