關(guān)于STM32莫名死機(jī)的一些問題記錄
問題描述
ZET6跑了ucosII系統(tǒng),在運(yùn)行過程中有時(shí)會出現(xiàn)死機(jī)的情況,經(jīng)過硬件調(diào)試發(fā)現(xiàn),是進(jìn)入延時(shí)的時(shí)候?qū)е碌倪@個(gè)問題,延時(shí)函數(shù)是沒有問題的,而且這個(gè)問題是偶爾出現(xiàn)
問題排查死機(jī)之后指針指向了硬件錯(cuò)誤中斷,初步猜測是因?yàn)闂R绯觯驗(yàn)榕芰讼到y(tǒng),并且函數(shù)的嵌套層數(shù)比較多,導(dǎo)致棧內(nèi)存不夠,進(jìn)入了硬件錯(cuò)誤中斷
解決方法將函數(shù)分離出來,減少函數(shù)嵌套,因?yàn)槊恳粋€(gè)函數(shù)都會分配單獨(dú)的內(nèi)存空間,所以多層的函數(shù)嵌套就會有多個(gè)函數(shù)空間,解決辦法就是減少函數(shù)嵌套,這樣當(dāng)一個(gè)函數(shù)執(zhí)行完彈棧之后,它的內(nèi)存空間就會被釋放。
其他資料使用keil編譯程序的時(shí)候,會顯示程序?qū)?nèi)存的占用情況,其含義如下
Code為程序代碼部分
RO-data 表示 程序定義的常量 const temp;
RW-data 表示 已初始化的全局變量
ZI-data 表示 未初始化的全局變量
Total RO Size (Code + RO Data)
Total RW Size (RW Data + ZI Data)
Total ROM Size (Code + RO Data + RW Data)
初始化時(shí)RW-data從flash拷貝到RAM
可以修改程序定義的堆棧大小
猜想因?yàn)樯暾埩撕芏嗔銜r(shí)變量,可能需要調(diào)整Stack_Size
在STM32F10x.s文件中
修改Stack_Size EQU 0x00000200
成Stack_Size EQU 0x00000400