stm32 堆溢出

Posted liujiangyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32 堆溢出相关的知识,希望对你有一定的参考价值。

STM32 堆溢出

遇到的问题

最近在给旧项目添加了段代码,程序经常到某个状态就突然崩溃了,也不一定是在运行新代码的时候崩溃。检查了几遍代码,数组越界访问,除数为0,内存泄露等常见的问题都不存在。

原因

最后发现,问题出在程序中用mallc动态分配内存,却没对是否成功分配做检查。程序中,因为堆空间不足,分配内存不成功,malloc返回NULL。后面的代码对NULL地址进行写操作,引起了程序崩溃。

后续的一些概念整理

  1. STM32系列单片机在startup_stm32fxx.s文件中,定义了Heap_Size 和 Stack_Size.常见的大小分别是0x200(512 bytes),0x400(1024 bytes),大小可以修改,但是要考虑程序的规模和单片机IRAM的大小。

  2. 堆和栈在IRAM中分配。堆和栈在IRAM中的绝对地址不是固定的,IRAM 中section 排列顺序:.data , .bass, HEAP , STACK。

  3. 不同的程序,由于定义的函数和变量不一样,.data 和 .bass 两个section 的大小不一样,导致HEAP和STACK的绝对地址不一样。

  4. 为了节省IRAM的空间,可以将不需要改变的数组声明为const类型。const类型变量会存放在代码区(flash 区域),否则存放在IRAM。

以上是关于stm32 堆溢出的主要内容,如果未能解决你的问题,请参考以下文章

stm32中的堆栈地址在哪里定义的

weblogic 内存 及 内存溢出

jarvis level6_x64堆溢出unlink拾遗

用例子解释编程中的栈溢出和堆溢出? [复制]

JVM内存溢出分析:堆内存溢出+虚拟机+方法区——JVM系列

第二章:Java堆内存溢出