关于STM32内存泄漏的问题

在项目开发中遇到了比较神奇的现象,间隔二三十分钟上电设备就不好使,但是短时间重复上电设备就好使,第一感觉归咎于硬件问题,感觉可能EEPROM出现了问题,但是通过调试发现是软件的问题,代码在不好使的情况下跑进了void HardFault_Handler中。

如果去网络上寻找问题原因,大部分会归咎于设置中的Use MicroLIB没有被勾选,因为在使用printf的重定向的时候就要勾选它,否则会进入硬件错误。但是每次写代码前,这些基础的设定一开始就会勾选好。
在这里插入图片描述

经过一点点排查发现,由于自己偷懒,想少些点逻辑代码,将一个局部double类型变量写的特别大,这个时候超出了启动文件中设定的值,也就是栈空间的大小,导致内存泄漏,进入了硬件错误中断里面。
在这里插入图片描述
开辟栈的大小为1KB(0x00000400),名字为STACK,NOINIT(不初始化),可读可写,8(2^3)字节对齐(EQU类似于宏定义,AREA告诉汇编器汇编一个新的代码段或数据段,SPACE用于开辟一定大小的内存空间,单位是字节)

栈的作用是用于局部变量,函数调用,函数形参等的开销,大小不能超过内部SRAM的大小。若编写的程序较大,局部变量多,则需修改栈的大小。

因此解决问题方法如下:
1.修改栈空间的大小,就是上面的EQU的值,保证不能超过内部SRAM,按着现在的单片机的性能来说,一般不用考虑超出上限,除非非常无脑写了一个巨大的变量,那当我没说。
2.直接把局部变量加个static给放到全局区,我是这么解决的。
3.不要偷懒,把变量变小,多增加逻辑代码。
最后:在写代码的时候,一定要掌握好基础以及调试方法,当代码写了成千上万行时,调试时间成本也会上去,尤其是一个问题的出现充满了不确定性,在写代码时就要做好预防。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值