新四季網

stm32單片機的優缺點功耗和性價比(詳解STM32單片機的堆棧)

2023-07-24 04:38:46

學習STM32單片機的時候,總是能遇到「堆棧」這個概念。分享本文,希望對你理解堆棧有幫助。

對於了解一點彙編編程的人,就可以知道,堆棧是內存中一段連續的存儲區域,用來保存一些臨時數據。堆棧操作由PUSH、POP兩條指令來完成。而程序內存可以分為幾個區:

棧區(stack)堆區(Heap)全局區(static)文字常亮區程序代碼區

程序編譯之後,全局變量,靜態變量已經分配好內存空間,在函數運行時,程序需要為局部變量分配棧空間,當中斷來時,也需要將函數指針入棧,保護現場,以便於中斷處理完之後再回到之前執行的函數。

棧是從高到低分配,堆是從低到高分配。

普通單片機與STM32單片機中堆棧的區別

普通單片機啟動時,不需要用bootloader將代碼從ROM搬移到RAM。

但是STM32單片機需要,可以參考相關文章:STM32代碼的啟動過程。這裡我們可以先看看單片機程序執行的過程,單片機執行分三個步驟:

取指令分析指令執行指令

根據PC的值從程序存儲器讀出指令,送到指令寄存器。然後分析執行執行。這樣單片機就從內部程序存儲器去代碼指令,從RAM存取相關數據。

RAM取數的速度是遠高於ROM的,但是普通單片機因為本身運行頻率不高,所以從ROM取指令慢並不影響。

而STM32的CPU運行的頻率高,遠大於從ROM讀寫的速度。所以需要用bootloader將代碼從ROM搬移到RAM。

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

其實堆棧就是單片機中的一些存儲單元,這些存儲單元被指定保存一些特殊信息,比如地址(保護斷點)和數據(保護現場)。

如果非要給他加幾個特點的話那就是:

這些存儲單元中的內容都是程序執行過程中被中斷打斷時,事故現場的一些相關參數。如果不保存這些參數,單片機執行完中斷函數後就無法回到主程序繼續執行了。這些存儲單元的地址被記在了一個叫做堆棧指針(SP)的地方。結合STM32的開發講述堆棧

從上面的描述可以看得出來,在代碼中是如何佔用堆和棧的。可能很多人還是無法理解,這裡再結合STM32的開發過程中與堆棧相關的內容來進行講述。

如何設置STM32的堆棧大小?

在基於MDK的啟動文件開始,有一段彙編代碼是分配堆棧大小的。

這裡重點知道堆棧數值大小就行。還有一段AREA(區域),表示分配一段堆棧數據段。數值大小可以自己修改,也可以使用STM32CubeMX數值大小配置,如下圖所示。

STM32F1默認設置值0x400,也就是1K大小。

Stack_Size EQU 0x400

函數體內局部變量:

void Fun(void){ char i; int Tmp[256]; //...}

局部變量總共佔用了256*4 1位元組的棧空間。所以,在函數內有較多局部變量時,就需要注意是否超過我們配置的堆棧大小。

函數參數:

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

這裡要強調一點:傳遞指針只佔4位元組,如果傳遞的是結構體,就會佔用結構大小空間。提示:在函數嵌套,遞歸時,系統仍會佔用棧空間。

堆(Heap)的默認設置0x200(512)字節。

Heap_Size EQU 0x200

大部分人應該很少使用malloc來分配堆空間。雖然堆上的數據只要程式設計師不釋放空間就可以一直訪問,但是,如果忘記了釋放堆內存,那麼將會造成內存洩漏,甚至致命的潛在錯誤。

MDK中RAM佔用大小分析

經常在線調試的人,可能會分析一些底層的內容。這裡結合MDK-ARM來分析一下RAM佔用大小的問題。在MDK編譯之後,會有一段RAM大小信息:

這裡4 1636=1640,轉換成16進位就是0x668,在進行在調試時,會出現:

這個MSP就是主堆棧指針,一般我們復位之後指向的位置,復位指向的其實是棧頂:

而MSP指向地址0x20000668是0x20000000偏移0x668而得來。具體哪些地方佔用了RAM,可以參看map文件中【Image Symbol Table】處的內容:

文章來源於網絡,版權歸原作者所有,如有侵權,請聯繫刪除。

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了