關(guān)于STM32莫名死機(jī)的一些問(wèn)題記錄
問(wèn)題描述
ZET6跑了ucosII系統(tǒng),在運(yùn)行過(guò)程中有時(shí)會(huì)出現(xiàn)死機(jī)的情況,經(jīng)過(guò)硬件調(diào)試發(fā)現(xiàn),是進(jìn)入延時(shí)的時(shí)候?qū)е碌倪@個(gè)問(wèn)題,延時(shí)函數(shù)是沒(méi)有問(wèn)題的,而且這個(gè)問(wèn)題是偶爾出現(xiàn)
問(wèn)題排查死機(jī)之后指針指向了硬件錯(cuò)誤中斷,初步猜測(cè)是因?yàn)闂R绯?,因?yàn)榕芰讼到y(tǒng),并且函數(shù)的嵌套層數(shù)比較多,導(dǎo)致棧內(nèi)存不夠,進(jìn)入了硬件錯(cuò)誤中斷
解決方法將函數(shù)分離出來(lái),減少函數(shù)嵌套,因?yàn)槊恳粋€(gè)函數(shù)都會(huì)分配單獨(dú)的內(nèi)存空間,所以多層的函數(shù)嵌套就會(huì)有多個(gè)函數(shù)空間,解決辦法就是減少函數(shù)嵌套,這樣當(dāng)一個(gè)函數(shù)執(zhí)行完彈棧之后,它的內(nèi)存空間就會(huì)被釋放。
其他資料使用keil編譯程序的時(shí)候,會(huì)顯示程序?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)樯暾?qǐng)了很多零時(shí)變量,可能需要調(diào)整Stack_Size
在STM32F10x.s文件中
修改Stack_Size EQU 0x00000200
成Stack_Size EQU 0x00000400