STM32陣列變數陣列過大時的異常處理

2021-09-30 17:18:02 字數 714 閱讀 9846

當在乙個函式中宣告乙個較大的區域性陣列變數時,程式可以編譯通過,但執行時,老是進入hardfaulthandler,導致出現改問題的原因可能是棧溢位。因為區域性變數是存放在棧區的,而全域性變數在全域性區(靜態區),如果棧區較小,會產生溢位。

解決這種問題的方法:

方法1:啟動檔案裡面對棧的大小有固定的值。函式裡面的陣列是在呼叫該函式的時候,才給你分配空間。將啟動檔案下的堆疊改大

stack_size equ 0x00000400 。

stack size,一般小工程0x400足夠,大工程才設定0x1000就夠用,所以預設無需設定太大。

方法2:用靜態陣列代替普通區域性陣列。

方法3:陣列過大,棧溢位了,有可能覆蓋了其他全域性變數的值。如果使用很大的陣列,可以定義成乙個全域性變數。如果使用的有os。就使用記憶體管理。

堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。

棧是先進後出的,但是對於堆而言卻沒有這個特性,兩者都是存放臨時資料的地方。 對於堆,我們可以隨心所欲的進行增加變數和刪除變數,不要遵循什麼次序,不管大小,只要你喜歡

*棧,用於存放區域性變數,區域性陣列等

*堆,用於儲存new 和malloc這些自定義的記憶體變數;

*全域性靜態區用於儲存全域性變數和靜態變數;

*字元常量區,用於儲存字串;

***區,用於儲存程式的二進位制**;

STM32陣列越界問題

前段時間在寫stm32程式時,發現定義的區域性變數會發生莫名其妙的陣列越界,改變其定義順序問題竟然得到解決,懷疑是堆疊空間沒有分配夠,於是決定追根溯源,查到一些資料,將startup stm32f10x hd.s中的棧空間改大即可 stack size equ 0x00000400 棧空間大小 ar...

關於STM32中定義陣列的問題

功能描述 今天做資料採集,tim2定時中斷20ms採集一次資料,並存入乙個陣列中。採集完4000個資料後,用串列埠將這4000個資料依次傳送給上位機。問題描述 debug中對陣列指標add watch,發現指標由0增加至1後就不再增加,懷疑tim2配置有問題,只進了一次中斷。於是查了半天關於定時中斷...

關於STM32的變數定義

關於stm32的變數定義 分類 嵌入式系統 2014 10 15 19 03 983人閱讀 收藏 舉報 今天除錯程式時,想觀察一下變數的情況,突然發現平時經常移植別人程式時最容易忽略的乙個致命問題,那就是忽略變數型別,這裡有必要給大家一定知識啦,都是庫裡面的,非原創!3.0以後的版本中使用了cmsi...