调试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也纷歧定是栈溢出的直接成果,仅仅入栈后数据被修正,出栈时跳转过错(最简单呈现),导致指令拜访过错,或许数据拜访过错。