日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]本人在運行ucos時遇到一個非常奇怪的問題,運行一段時間后就會莫名進入hardfault函數,導致系統死機。后來根據對堆棧調試,發(fā)現每次調用的函數都不一樣,甚是費解。通過map文件最后得出結論,原來在系統初始化的時候

本人在運行ucos時遇到一個非常奇怪的問題,運行一段時間后就會莫名進入hardfault函數,導致系統死機。后來根據對堆棧調試,發(fā)現每次調用的函數都不一樣,甚是費解。通過map文件最后得出結論,原來在系統初始化的時候在flash里面讀出了系統配置參數,在系統運行過程中會寫flash,而flash定義的地址與程序代碼存儲的位置發(fā)生了重疊,一寫數據就擦掉了一些函數,當調用到這些函數的時候就會發(fā)生未知指令的錯誤。把這個參數存儲地址定義的分開些就會解決這個問題??墒?,開始這個地址寫好了,隨著程序代碼不斷增多,消耗的片上flash也會增大,是個動態(tài)增長的過程,不注意很有可能發(fā)生沖突。所以在項目開發(fā)過程中定期檢查定義的參數存儲地址,或者干脆把參數存儲地址定義在程序地址之前。

今天詳細了解一下編譯后的STM32工程,堆棧內存分布情況,有助于對堆棧大小分配的理解。打開一個基于STM32f103RET6的工程,具有512KB內置flash,以及64KBSRAM,通過map文件可以看出:

名稱

位置

地址

備注

RESET復位向量

Flash

0x08000000

上電執(zhí)行的第一條代碼

庫函數代碼段

Flash

0x08000144

在程序中調用的庫函數,例如字符串處理函數、內存分配函數等

用戶自定義函數代碼段

Flash

0x08001110

工程模板函數庫、用戶自定義函數編譯后的代碼,以函數名首字母排序

.constdata

Flash

0x0800d07c-0x0800d680

用戶定義的常量

剩余空間

Flash



名稱

位置

地址

備注

.data

SRAM

0x20000000

數據段,以及初始化的全局變量

.bss

SRAM

0x20000268

未初始化的全局變量

HEAP(堆)

SRAM

0x200033e8

啟動文件定義的堆空間開始,程序調用malloc自由分配的內存在堆上

STACK(棧)

SRAM

0x200073e8

啟動文件定義的棧空間開始,各個函數中的局部變量空間分配到棧上

剩余空間

SRAM



例如在這個工程中,flash自定義參數存儲地址,不要定義在0x0800d680之前。


另外,還可以看出在SRAM里,分配存儲的是全局變量區(qū),未初始化變量區(qū),堆以及棧。要注意的是,如果堆和棧定義的過小,程序默認定義都不大,一旦使用了一個較大的局部變量,有可能造成??臻g溢出,覆蓋掉堆空間甚至上面的全局變量區(qū),造成系統出錯的問題。例如在做IAP的過程中,每當向flash寫入512個字節(jié)時,由于大容量STM32片上flash塊大小為2K,寫之前要先讀出,調用寫函數的時候就自動創(chuàng)建一個2K大小的局部變量,由于棧是向上增長的,自然會覆蓋堆以及全局變量區(qū),造成未知的錯誤。根據片上SRAM的資源,將堆和棧適當調大一些為好,比如各設置為4K大小。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉