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