调试stm32程序,发现如下问题:
STM32编写程序,当程序中没有sd卡部分时,程序正常下载,正常运行。当程序中运行sd卡加文件系统时程序能正常下载但是不能正常的运行。发现问题就要解决问题呀,好了大家一起来和我解决问题吧!
根据自己问题,上网查找解决办法,最终将问题锁定在堆栈设置问题上。(堆栈设置的空间不够大)
解决办法:在stm32的程序目录下查找STM32F10x.s(或者是startup_stm32f10x_hd,这取决于你是用的寄存器还是函数库)
在打开文件,在文件的开头很醒目的位置,发现了关于堆栈的设置。
从中我们可以看出来对于栈(stack)的大小设置为0x200,堆(heap)的大小为0x0,当修改程序为栈(stack)的大小设置为0x800,堆(heap)的大小为0x400。再试一下,没错,程序可以正常的运行了!
注意:我曾尝试单纯的修改栈或者单纯的修改堆的大小但是程序还都是不运行。这似乎说明程序中即有栈溢出,也有堆不够的情况。
分析:原来的设置栈stack的数量是0x200即512个字节。在Fatfs操作过程中,他的每一个写操作的单位就是512字节,堆栈也是512字节,自然会溢出没得说,然后程序就会跳到硬件中断那里歇着去了。所以我们把他改成了2048个字节。(大点应该没有坏处吧。。)
另外,栈溢出不一定会死机,比如栈只生长到堆区,或者稍微进入变量区,而且溢出整个过程不对这些区域做写入操作,不对这些区域做取指操作,就可以完美避免hardfault,但溢出还是溢出了,数据还是被修改了.最"直接"的表现是函数调用后,还没看到执行用户代码就发现某些不相干的数据被修改,不过这也足够隐蔽了. 而且,hardfault也不一定是栈溢出的直接结果,只是入栈后数据被修改,出栈时跳转错误(最容易出现),导致指令访问错误,或者数据访问错误。
好这里就说到这里了,下一篇博客将是对stm32堆栈的引申学习
传送门: