在项目开发中遇到了比较神奇的现象,间隔二三十分钟上电设备就不好使,但是短时间重复上电设备就好使,第一感觉归咎于硬件问题,感觉可能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.不要偷懒,把变量变小,多增加逻辑代码。
最后:在写代码的时候,一定要掌握好基础以及调试方法,当代码写了成千上万行时,调试时间成本也会上去,尤其是一个问题的出现充满了不确定性,在写代码时就要做好预防。