0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于STM32存儲的堆棧地址

要長高 ? 來源:小平頭社區(qū) ? 作者:CSDN博客 ? 2022-06-05 16:37 ? 次閱讀

由c/C++編譯的程序占用的內(nèi)存分為以下幾個部分

1、棧區(qū)(stack)—由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

2、堆區(qū)(heap)—一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。

3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。-程序結(jié)束后有系統(tǒng)釋放

4、文字常量區(qū)—常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放

5、程序代碼區(qū)—存放函數(shù)體的二進制代碼。

pYYBAGKYddeAREVgAASmCfjjtMk801.png

STM32的地址空間映射圖

我們可以看到代碼存儲區(qū)域在CODE區(qū)域;

STM32的堆棧是存放在片上靜態(tài)SRAM中的,地址分配可以見Keil的編譯map文件:

代碼來源地址:https://download.csdn.net/download/emoeror_zhang/11286638

HEAP0x20000148Section512startup_stm32f10x_hd.o(HEAP)

STACK0x20000348Section1024startup_stm32f10x_hd.o(STACK)

__initial_sp0x20000748Data0startup_stm32f10x_hd.o(STACK)

上面節(jié)選中,HEAP是堆的基地址,__initial_sp是棧指針。示意圖如下

pYYBAGKYdeaAagmNAACNKStVFbc164.png

堆棧地址的設(shè)置

在上述圖和map中,我么可以看到堆的大小是0線0x200,也就是在0x20000148-0x20000348之間,而棧的地址大小是0x400,也就是在0x20000348-0x20000748。為什么他們的大小是這樣的,是怎么由來的呢?

打開匯編文件startup_stm32f10x_hd.s,我們可以找到相對應(yīng)的設(shè)置堆棧大小的程序,如圖:

poYBAGKYdfqAIeAdAADmPvi82uU094.png

堆和棧,一般堆是由低地址往上增長,棧是由往下減少。都是連續(xù)的,C語言不提供內(nèi)存保護機制類似的功能,如果堆一直增長,棧一直申請,然后就會導(dǎo)致棧溢出,從而導(dǎo)致程序崩潰。

變量儲存位置分析

同樣的,我們還是以上述的map文件為例子進行分析。

pYYBAGKYdg2AMF5EAASKMxLkq5M724.png

如圖所示,fac_ms和fac_us在程序中是static變量類型,儲存在0x20000000-0x20000148之間的位置,fac_ms在0x20000016,fac_us在0x20000014,那其他的地址處是什么數(shù)據(jù)呢?

繼續(xù)在map里面尋找,找到如下圖所示:

pYYBAGKYdhqAJswbAAJueeLqXBM513.png

pYYBAGKYdi2AIM_dAAElpGJE-zs610.png

發(fā)現(xiàn)其余的地質(zhì)處儲存了全局變量數(shù)組,以及引用的庫文件的全局變量。

在map里面我們看到,全局變量和靜態(tài)變量儲存的位置,和堆棧無關(guān),那么堆棧儲存的內(nèi)容是什么呢?

五、堆棧存放內(nèi)容

1、棧區(qū)

存放函數(shù)的參數(shù)值,局部變量的值等等臨時變量,退出該作用域該臨時變量就會自動釋放。

2、堆區(qū)

系統(tǒng)會給每個程序分配一部分棧空間讓他們能夠運行起來,問題就是棧空間必然存在不夠用的問題,而堆不屬于程序,堆是獨立的,是公用的。只要你malloc(sizeof(SIZE_YOU_WANT)),就可以得到相應(yīng)一部分的堆空間。

簡單的來說,就是當(dāng)你使用的時候malloc申請一部分空間來使用,但是別忘記了使用完成之后free掉,不然往往會堆溢出,占用了棧的位置空間,導(dǎo)致程序奔潰。

總結(jié):

如果我們設(shè)置了堆的空間大小,但是我們程序中沒有進行malloc申請,那么在程序事假運行的時候,我們棧的空間超過本身設(shè)置的空間,進入到堆里面,那么程序是不會出錯的,但是超過了堆的空間了,進入到全局變量區(qū)域,就會出現(xiàn)莫名其妙的錯誤。

不使用malloc,我們可以將堆設(shè)置成0,這是沒有問題的,但是棧的空間大小要設(shè)置成合適的,不然就會因為棧溢出,進入harderror,程序奔潰。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • sram
    +關(guān)注

    關(guān)注

    6

    文章

    768

    瀏覽量

    114756
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10915

    瀏覽量

    356754
收藏 人收藏

    評論

    相關(guān)推薦

    STM32如何定義堆棧地址到RAM區(qū)頂端

    ,測試驗證成功,開始時堆棧地址指向RAM的頂端,即R13的值為0x20005000 關(guān)注微信公眾號:嵌入式STM32軟硬件開發(fā),來學(xué)習(xí)更多STM32開發(fā)的深入知識。
    發(fā)表于 12-07 14:14

    關(guān)于STM32堆棧指針(MSP)與進程堆棧指針(PSP)

    我正在閱讀STM32編程手冊和“ 第18頁 ”的某處,我看到了這兩種堆棧指針。我一直認(rèn)為只有一個堆棧,因此只有一個堆棧指針存在于MCU中,現(xiàn)在我對這些指針的含義感到困惑,主題和每個指針
    發(fā)表于 10-30 11:46

    stm32上ucosii堆棧存儲該怎么用?

    將ucosii一致到stm32上時,給任務(wù)分配的堆棧是放在32的堆棧區(qū)了,還是靜態(tài)存儲去了,因為我們給任務(wù)設(shè)計的堆棧實質(zhì)上是一個全局變量的數(shù)
    發(fā)表于 08-30 01:10

    詳解STM32單片機的堆棧

    的一些相關(guān)參數(shù)。如果不保存這些參數(shù),單片機執(zhí)行完中斷函數(shù)后就無法回到主程序繼續(xù)執(zhí)行了。這些存儲單元的地址被記在了一個叫做堆棧指針(SP)的地方。結(jié)合STM32的開發(fā)講述
    發(fā)表于 01-12 11:30

    關(guān)于堆棧的問題

    置頂/星標(biāo)公眾號,不錯過每一條消息前段時間分享文章《STM32的啟動流程到底是怎樣的?》之后,很多朋友問了關(guān)于堆棧的問題。今天就寫點相關(guān)內(nèi)容,讓大家進一步了解堆棧...
    發(fā)表于 11-01 09:10

    STM32堆棧地址是怎么得出來的?

    STM32堆棧地址是怎么得出來的?
    發(fā)表于 11-26 07:14

    STM32WB5MMG上無線堆棧的起始地址可以設(shè)置成什么呢

    選項 -firstinstall=0 時由 STM32CubeProgrammer 執(zhí)行的)我看到新圖像是 167 KB,從日志中,我認(rèn)為當(dāng)前堆棧可能是 8192 字節(jié),但我仍然不清楚將什么設(shè)置為起始地址。
    發(fā)表于 12-08 06:02

    STM32WB55RC 256K閃存的Zigbee堆棧實際地址是什么?

    我們正在嘗試在STM32WB55RC上加載 stm32wb5x_Zigbee_FFD_fw.bin,但發(fā)行說明中的??地址表顯示 FFD 堆棧為 0x00,STMCube 程序員給出了
    發(fā)表于 12-23 09:03

    STM32內(nèi)存管理以及STM32中的堆棧

    文件里面,就有堆棧的設(shè)置,其實這個堆棧的內(nèi)存占用就是在上面RAM分配給RW-data+ZI-data之后的地址開始分配的。
    的頭像 發(fā)表于 03-29 13:45 ?1.3w次閱讀

    一文解析STM32內(nèi)存管理和堆棧的認(rèn)知與理解

    本文主要介紹了STM32內(nèi)存管理和堆棧的認(rèn)知與理解,首先介紹的是內(nèi)存管理的實現(xiàn)原理及分配、釋放原理,其次介紹了stm32存儲器結(jié)構(gòu),最后闡述了堆棧
    的頭像 發(fā)表于 04-26 16:22 ?1.8w次閱讀
    一文解析<b class='flag-5'>STM32</b>內(nèi)存管理和<b class='flag-5'>堆棧</b>的認(rèn)知與理解

    關(guān)于單片機堆棧操作:堆棧是單片機中的存儲單元

    堆棧這個東西,所以就找了個時間把堆棧給徹底的搞一下。 如果了解一點匯編編程話,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲區(qū)域,用來保存一些臨時數(shù)據(jù)。通常用來保存CALL指令調(diào)用子程序時的返
    的頭像 發(fā)表于 10-21 17:32 ?5557次閱讀
    <b class='flag-5'>關(guān)于</b>單片機<b class='flag-5'>堆棧</b>操作:<b class='flag-5'>堆棧</b>是單片機中的<b class='flag-5'>存儲</b>單元

    虛擬地址物理地址等眾多地址及MMU相關(guān)知識

    虛擬地址物理地址等眾多地址及MMU相關(guān)知識先聊聊存儲STM32單片機存儲
    發(fā)表于 12-08 12:36 ?12次下載
    虛擬<b class='flag-5'>地址</b>物理<b class='flag-5'>地址</b>等眾多<b class='flag-5'>地址</b>及MMU相關(guān)知識

    stm32修改堆棧大?。?b class='flag-5'>堆棧空間不足導(dǎo)致死機)

    1. 設(shè)置堆棧空間大小在使用STM32編程時,一般情況下我們不會關(guān)注堆棧空間的大小,因為在STM32的啟動文件中,已經(jīng)幫我們預(yù)先設(shè)置好了堆棧
    發(fā)表于 12-27 19:09 ?22次下載
    <b class='flag-5'>stm32</b>修改<b class='flag-5'>堆棧</b>大?。?b class='flag-5'>堆棧</b>空間不足導(dǎo)致死機)

    詳解STM32單片機的堆棧

    學(xué)習(xí)STM32單片機的時候,總是能遇到“堆棧”這個概念。分享本文,希望對你理解堆棧有幫助。
    發(fā)表于 02-08 15:41 ?5次下載
    詳解<b class='flag-5'>STM32</b>單片機的<b class='flag-5'>堆棧</b>

    STM32WB BLE 堆棧編程指南

    STM32WB BLE 堆棧編程指南
    發(fā)表于 11-24 08:29 ?3次下載
    <b class='flag-5'>STM32</b>WB BLE <b class='flag-5'>堆棧</b>編程指南