色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

詳解STM32單片機堆棧

dyquk4xk2p3d ? 來源:嵌入式Linux ? 2023-10-29 16:41 ? 次閱讀

學(xué)習(xí)STM32單片機的時候,總是能遇到“堆棧”這個概念。分享本文,希望對你理解堆棧有幫助。

對于了解一點匯編編程的人,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲區(qū)域,用來保存一些臨時數(shù)據(jù)。堆棧操作由PUSH、POP兩條指令來完成。而程序內(nèi)存可以分為幾個區(qū):

棧區(qū)(stack)

堆區(qū)(Heap)

全局區(qū)(static)

文字常亮區(qū)程序代碼區(qū)

程序編譯之后,全局變量,靜態(tài)變量已經(jīng)分配好內(nèi)存空間,在函數(shù)運行時,程序需要為局部變量分配棧空間,當(dāng)中斷來時,也需要將函數(shù)指針入棧,保護現(xiàn)場,以便于中斷處理完之后再回到之前執(zhí)行的函數(shù)。

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

普通單片機與STM32單片機中堆棧的區(qū)別

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

但是STM32單片機需要。

這里我們可以先看看單片機程序執(zhí)行的過程,單片機執(zhí)行分三個步驟:

取指令

分析指令

執(zhí)行指令

根據(jù)PC的值從程序存儲器讀出指令,送到指令寄存器。然后分析執(zhí)行執(zhí)行。這樣單片機就從內(nèi)部程序存儲器去代碼指令,從RAM存取相關(guān)數(shù)據(jù)。

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

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

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

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

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

這些存儲單元中的內(nèi)容都是程序執(zhí)行過程中被中斷打斷時,事故現(xiàn)場的一些相關(guān)參數(shù)。如果不保存這些參數(shù),單片機執(zhí)行完中斷函數(shù)后就無法回到主程序繼續(xù)執(zhí)行了。

這些存儲單元的地址被記在了一個叫做堆棧指針(SP)的地方。

結(jié)合STM32的開發(fā)講述堆棧

從上面的描述可以看得出來,在代碼中是如何占用堆和棧的。可能很多人還是無法理解,這里再結(jié)合STM32的開發(fā)過程中與堆棧相關(guān)的內(nèi)容來進行講述。

如何設(shè)置STM32的堆棧大小?

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

a51554e8-7633-11ee-939d-92fbcf53809c.png

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

a534bffe-7633-11ee-939d-92fbcf53809c.png

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

Stack_Size EQU 0x400

函數(shù)體內(nèi)局部變量:

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

局部變量總共占用了256*4 + 1字節(jié)的棧空間。所以,在函數(shù)內(nèi)有較多局部變量時,就需要注意是否超過我們配置的堆棧大小。

函數(shù)參數(shù):

voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef *GPIO_Init)

這里要強調(diào)一點:傳遞指針只占4字節(jié),如果傳遞的是結(jié)構(gòu)體,就會占用結(jié)構(gòu)大小空間。提示:在函數(shù)嵌套,遞歸時,系統(tǒng)仍會占用棧空間。

堆(Heap)的默認設(shè)置0x200(512)字節(jié)。

Heap_Size EQU 0x200

大部分人應(yīng)該很少使用malloc來分配堆空間。雖然堆上的數(shù)據(jù)只要程序員不釋放空間就可以一直訪問,但是,如果忘記了釋放堆內(nèi)存,那么將會造成內(nèi)存泄漏,甚至致命的潛在錯誤。

MDK中RAM占用大小分析

經(jīng)常在線調(diào)試的人,可能會分析一些底層的內(nèi)容。這里結(jié)合MDK-ARM來分析一下RAM占用大小的問題。在MDK編譯之后,會有一段RAM大小信息:

a53e0172-7633-11ee-939d-92fbcf53809c.png

這里4+6=1640,轉(zhuǎn)換成16進制就是0x668,在進行在調(diào)試時,會出現(xiàn):

a5508f4a-7633-11ee-939d-92fbcf53809c.png

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

a569cb0e-7633-11ee-939d-92fbcf53809c.png

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

a57315e2-7633-11ee-939d-92fbcf53809c.png

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

    關(guān)注

    6050

    文章

    44723

    瀏覽量

    641757
  • ROM
    ROM
    +關(guān)注

    關(guān)注

    4

    文章

    576

    瀏覽量

    86409
  • STM32
    +關(guān)注

    關(guān)注

    2278

    文章

    10960

    瀏覽量

    359498

原文標題:詳解STM32單片機堆棧

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦

    詳解STM32單片機堆棧

    學(xué)習(xí)STM32單片機的時候,總是能遇到“堆棧”這個概念。分享本文,希望對你理解堆棧有幫助。 對于了解一點匯編編程的人,就可以知道,堆棧是內(nèi)存
    發(fā)表于 01-12 11:30

    STM32單片機堆棧是什么意思

    學(xué)習(xí)STM32單片機的時候,總是能遇到“堆棧”這個概念。對于了解一點匯編編程的人,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲區(qū)域,用來保存一些臨時數(shù)據(jù)。
    發(fā)表于 11-26 06:15

    51單片機STM32單片機有哪些區(qū)別

    大部分朋友可能都知道51單片機stm32單片機也知道一般入門會先學(xué)習(xí)51單片機在學(xué)習(xí)stm32單片機
    發(fā)表于 08-13 17:32 ?17次下載
    51<b class='flag-5'>單片機</b>和<b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>有哪些區(qū)別

    什么是單片機堆棧單片機堆棧有什么作用和原理說明

    什么是單片機堆棧?在片內(nèi)RAM中,常常要指定一個專門的區(qū)域來存放某些特別的數(shù)據(jù),它遵循順序存取和后進先出(LIFO/FILO)的原則,這個RAM區(qū)叫堆棧
    的頭像 發(fā)表于 08-03 09:29 ?2.1w次閱讀

    STM32單片機堆棧深入解析

    學(xué)習(xí)STM32單片機的時候,總是能遇到堆棧這個概念。分享本文,希望對你理解堆棧有幫助。 對于了解一點匯編編程的人,就可以知道,堆棧是內(nèi)存中一
    的頭像 發(fā)表于 10-30 17:31 ?4850次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>的<b class='flag-5'>堆棧</b>深入解析

    單片機堆棧是什么?它的原理和作用又是什么?

    什么是單片機堆棧?在片內(nèi)RAM中,常常要指定一個專門的區(qū)域來存放某些特別的數(shù)據(jù),它遵循順序存取和后進先出(LIFO/FILO)的原則,這個RAM區(qū)叫堆棧。它的作用子程序調(diào)用和中斷服務(wù)時CPU自動將
    發(fā)表于 11-11 10:51 ?70次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>堆棧</b>是什么?它的原理和作用又是什么?

    單片機入門--常見單片機PIC\STM32

    單片機入門--常見單片機PIC\STM32
    發(fā)表于 11-13 14:36 ?43次下載
    <b class='flag-5'>單片機</b>入門--常見<b class='flag-5'>單片機</b>PIC\<b class='flag-5'>STM32</b>

    hc05與單片機連接圖_STM32單片機最小系統(tǒng)詳解

    是FLASH,RAM容量是48K,封裝LQFP64。STM32單片機命名規(guī)則:STM32單片機最小系統(tǒng):所謂單片機最小系統(tǒng),就是讓
    發(fā)表于 11-17 13:51 ?63次下載
    hc05與<b class='flag-5'>單片機</b>連接圖_<b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>最小系統(tǒng)<b class='flag-5'>詳解</b>

    詳解STM32單片機堆棧

    學(xué)習(xí)STM32單片機的時候,總是能遇到“堆棧”這個概念。對于了解一點匯編編程的人,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲區(qū)域,用來保存一些臨時數(shù)據(jù)。
    發(fā)表于 11-18 20:51 ?12次下載
    <b class='flag-5'>詳解</b><b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>的<b class='flag-5'>堆棧</b>

    分析單片機堆棧,分享個人理解

    看關(guān)于單片機方面的書籍的時候,總是能看到別人說的一些堆棧啊什么的操作,之前看到這個術(shù)語就直接跳過,沒想到去探究單片機內(nèi)部的原理。但是最近課程學(xué)習(xí)微機原理這門課,需要我們寫匯編程序,匯編里面經(jīng)常遇到
    發(fā)表于 11-22 09:21 ?6次下載
    分析<b class='flag-5'>單片機</b><b class='flag-5'>堆棧</b>,分享個人理解

    51單片機堆棧深入剖析

    上的擴展,既有C語言的共性,又有它自己的特點。本文介紹的是Cx51程序設(shè)計時堆棧的計算方法。   1.堆棧的溢出問題。MCS51系列單片機堆棧設(shè)置在片內(nèi)RAM中,由于片內(nèi)RAM資源有
    發(fā)表于 11-22 16:36 ?16次下載
    51<b class='flag-5'>單片機</b><b class='flag-5'>堆棧</b>深入剖析

    詳解STM32單片機堆棧

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

    普通單片機STM32單片機堆棧的區(qū)別

    學(xué)習(xí)STM32單片機的時候,總是能遇到“堆棧”這個概念。分享本文,希望對你理解堆棧有幫助。
    的頭像 發(fā)表于 04-13 11:15 ?3289次閱讀

    詳解STM32單片機和51單片機的區(qū)別

    分享本文,簡單分析STM32與51單片機的區(qū)別與取舍之處。
    的頭像 發(fā)表于 04-18 10:45 ?3.9w次閱讀

    一文詳解GD32單片機STM32單片機

    GD32單片機是中國龍芯集成電路公司推出的一款A(yù)RM Cortex-M3內(nèi)核的微控制器。它具有與STM32單片機相同的架構(gòu)和指令集,但是價格相比STM32更為便宜。同時,GD32
    發(fā)表于 08-09 16:58 ?1.1w次閱讀
    主站蜘蛛池模板: 亚洲日韩中文字幕日本有码 | 国产免费人成在线视频有码 | 国产成人在线观看免费网站 | 亚洲国产区中文在线观看 | 狠狠色狠狠色88综合日日91 | 人人干人人插 | 亚洲三级在线视频 | 香艳69xxxxx有声小说 | 被爽到叫呻呤视频免费视频 | 一本道亚洲区免费观看 | 丰满的寡妇hd高清在线观看 | xxx日本hd | 欧美黄色精品 | 欧洲-级毛片内射八十老太婆 | 久久99精品国产99久久6男男 | yellow免费影视大全 | 国产精品毛片AV久久97 | 国产东北男同志videos网站 | 激情内射亚州一区二区三区爱妻 | 秋秋影视午夜福利高清 | 在线中文字幕视频 | 亚洲中文字幕无码一久久区 | 成人a视频片在线观看免费 成人a毛片久久免费播放 | 在线亚洲97se | 超嫩校花被灌醉在线观看 | 国产剧果冻传媒星空在线观看 | 亚洲免费在线观看 | 在线播放一区二区精品产 | 人妻互换免费中文字幕 | 亚洲国产日韩欧美在线a乱码 | 国产高潮久久精品AV无码 | 小处雏一区二区三区 | 国产婷婷综合在线视频中文 | 99这里有精品视频视频 | 亚洲精品AV一二三区无码 | 欧美亚洲韩日午夜 | 老头xxx | 日日撸影院在线 | 试看做受120秒免费午夜剧场 | 毛片大片免费看 | 无码中文字幕热热久久 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品