STM32區域性變數過大導致棧溢位

2021-10-22 08:36:26 字數 602 閱讀 9788

最近專案除錯中發現只要使用memset函式對乙個區域性陣列賦值時,就會導致其他全域性變數值被更改,接著就進入hardfault錯誤。後來發現區域性變數和全域性變數位址重疊。

data_write結構體為全域性變數,ota_data為區域性陣列。

看了啟動檔案startup_stm32f10x_hd.s中棧stack_size設定的是0x00000800,而ota_data大小為2k,函式中還有其他的陣列,所以導致棧溢位,使用memset函式操作時就出現了hardfault錯誤。棧溢位程式編譯時不會有異常,需要自己注意。

解決這個問題可以修改啟動檔案中stack_size的大小,不過這個值一般不需要太大(此時陣列位於棧區);也可以使用static關鍵字修飾一下陣列,或者將陣列定義為全域性的(此時陣列位於全域性區(靜態區))。

4 11 區域性變數和全域性變數

在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的。同樣,在復合語句中定義的變數只在本復合語句範圍內有效。這稱為 區域性變數 local variable 如 對區域性變數的一些說明 1 主函式main中定義的變數 m,n...

JDK1 8 區域性變數表

jvm引數 verbose gcpublic class localvartest 執行結果 gc system.gc 68872 k 66336 k 125952 k 0.0014157 secs full gc system.gc 66336 k 66233 k 125952 k 0.00561...

python 09 區域性變數和全域性變數

區域性變數是在函式內部定義的變數,只能在函式內部使用 全域性變數是在函式外部定義的變數 沒有定義在某 個函式內 所有函式內部都可以使用這個變數 提示 在其他的開發語言中,大多不推薦使用全域性變數 可變範圍太大,導致程式不好維護 區域性變數是在函式內部定義的變數,只能在函式內部使用 函式執行結束後,函...