码迷,mamicode.com
首页 > 其他好文 > 详细

stm32 堆溢出

时间:2018-11-02 00:06:46      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:代码   ack   rtu   数组   flash   不同的   定义   heap   运行   

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 堆溢出

标签:代码   ack   rtu   数组   flash   不同的   定义   heap   运行   

原文地址:https://www.cnblogs.com/liujiangyi/p/9890774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!