STM32 堆溢出
遇到的问题
最近在给旧项目添加了段代码,程序经常到某个状态就突然崩溃了,也不一定是在运行新代码的时候崩溃。检查了几遍代码,数组越界访问,除数为0,内存泄露等常见的问题都不存在。
原因
最后发现,问题出在程序中用mallc动态分配内存,却没对是否成功分配做检查。程序中,因为堆空间不足,分配内存不成功,malloc返回NULL。后面的代码对NULL地址进行写操作,引起了程序崩溃。
后续的一些概念整理
STM32系列单片机在startup_stm32fxx.s文件中,定义了Heap_Size 和 Stack_Size.常见的大小分别是0x200(512 bytes),0x400(1024 bytes),大小可以修改,但是要考虑程序的规模和单片机IRAM的大小。
堆和栈在IRAM中分配。堆和栈在IRAM中的绝对地址不是固定的,IRAM 中section 排列顺序:.data , .bass, HEAP , STACK。
不同的程序,由于定义的函数和变量不一样,.data 和 .bass 两个section 的大小不一样,导致HEAP和STACK的绝对地址不一样。
为了节省IRAM的空间,可以将不需要改变的数组声明为const类型。const类型变量会存放在代码区(flash 区域),否则存放在IRAM。