stm32程序下載成功但是不運行
STM32編寫(xiě)程序,當程序中沒(méi)有sd卡部分時(shí),程序正常下載,正常運行。當程序中運行sd卡加文件系統時(shí)程序能正常下載但是不能正常的運行。發(fā)現問(wèn)題就要解決問(wèn)題呀,好了大家一起來(lái)和我解決問(wèn)題吧!?
本文引用地址:http://dyxdggzs.com/article/201611/317094.htm根據自己?jiǎn)?wèn)題,上網(wǎng)查找解決辦法,最終將問(wèn)題鎖定在堆棧設置問(wèn)題上。(堆棧設置的空間不夠大)
解決辦法:在?stm32的程序目錄下查找STM32F10x.s(或者是startup_stm32f10x_hd,這取決于你是用的寄存器還是函數庫)
在打開(kāi)文件,在文件的開(kāi)頭很醒目的位置,發(fā)現了關(guān)于堆棧的設置。??

從中我們可以看出來(lái)對于棧(stack)的大小設置為0x200,堆(heap)的大小為0x0,當修改程序為棧(stack)的大小設置為0x800,堆(heap)的大小為0x400。再試一下,沒(méi)錯,程序可以正常的運行了!

?
注意:我曾嘗試單純的修改?;蛘邌渭兊男薷亩训拇笮〉浅绦蜻€都是不運行。這似乎說(shuō)明程序中即有棧溢出,也有堆不夠的情況。
分析:原來(lái)的設置棧stack的數量是0x200即512個(gè)字節。在Fatfs操作過(guò)程中,他的每一個(gè)寫(xiě)操作的單位就是512字節,堆棧也是512字節,自然會(huì )溢出沒(méi)得說(shuō),然后程序就會(huì )跳到硬件中斷那里歇著(zhù)去了。所以我們把他改成了2048個(gè)字節。(大點(diǎn)應該沒(méi)有壞處吧。。)
另外,??棧溢出不一定會(huì )死機,比如棧只生長(cháng)到堆區,或者稍微進(jìn)入變量區,而且溢出整個(gè)過(guò)程不對這些區域做寫(xiě)入操作,不對這些區域做取指操作,就可以完美避免hardfault,但溢出還是溢出了,數據還是被修改了.最"直接"的表現是函數調用后,還沒(méi)看到執行用戶(hù)代碼就發(fā)現某些不相干的數據被修改,不過(guò)這也足夠隱蔽了.而且,hardfault也不一定是棧溢出的直接結果,只是入棧后數據被修改,出棧時(shí)跳轉錯誤(最容易出現),導致指令訪(fǎng)問(wèn)錯誤,或者數據訪(fǎng)問(wèn)錯誤。
評論