在開發STM32程序的時候,如果局部變量較多,應該時刻注意堆和棧的占用情況,今天出現的BUG就是因為沒有注意導致的。
看下面的代碼
// main.c
void func()
{
double x[1024];
// some code
}
// startup_stm32f407xx.s
Stack_Size EQU 0x800
// 中間省略
Heap_Size EQU 0x800
func
是我在main文件中定義的某個函數,然后在main函數中調用了它,startup_stm32f407xx.s
是stm32初始化文件,用匯編寫的,里面可以查詢到堆區和棧區的大小。
我們知道局部變量創建在棧區,我們設置的棧區大小為0x800,也就是2048Byte,一個double
類型占用8個字節,函數申請了一個1024個元素的double
數組,這很明顯就已經超出了堆棧范圍,所以程序運行直接崩潰。
我的解決辦法是把占用內存多的變量申請在全局區,這樣程序在編譯的時候會自動計算需要的空間,這樣就不會出錯了。
另一種辦法是修改堆棧大小,這種方法我還沒試過,因為我不清楚堆棧可以設置的上限是多少,如果有知道的大佬還希望能在評論區指教以下。小弟在這先謝謝了。