在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 作者:STM32嵌入式開發(fā) ? 2022-04-13 11:15 ? 次閱讀

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

對(duì)于了解一點(diǎn)匯編編程的人,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲(chǔ)區(qū)域,用來保存一些臨時(shí)數(shù)據(jù):嵌入式開發(fā)中更接近底層的匯編與C語言。堆棧操作由PUSH、POP兩條指令來完成。而程序內(nèi)存可以分為幾個(gè)區(qū):

棧區(qū)(stack)

堆區(qū)(Heap)

全局區(qū)(static)

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

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

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

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

普通單片機(jī)啟動(dòng)時(shí),不需要用bootloader將代碼從ROM搬移到RAM

但是STM32單片機(jī)需要。

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

取指令

分析指令

執(zhí)行指令

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

RAM取數(shù)的速度是遠(yuǎn)高于ROM的,但是普通單片機(jī)因?yàn)楸旧磉\(yùn)行頻率不高,所以從ROM取指令慢并不影響。

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

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

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

如果非要給他加幾個(gè)特點(diǎn)的話那就是:

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

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

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

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

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

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

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

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

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

STM32F1默認(rèn)設(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ù)參數(shù):

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

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

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

Heap_Size EQU 0x200

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

MDK中RAM占用大小分析

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

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

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

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

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

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

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

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

原文標(biāo)題:詳解STM32單片機(jī)的堆棧

文章出處:【微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅

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

    關(guān)注

    6065

    文章

    44935

    瀏覽量

    647728
  • STM32
    +關(guān)注

    關(guān)注

    2290

    文章

    11018

    瀏覽量

    362771
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    183

    瀏覽量

    20060

原文標(biāo)題:詳解STM32單片機(jī)的堆棧

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    詳解STM32單片機(jī)堆棧

    ,程序需要為局部變量分配棧空間,當(dāng)中斷來時(shí),也需要將函數(shù)指針入棧,保護(hù)現(xiàn)場,以便于中斷處理完之后再回到之前執(zhí)行的函數(shù)。 棧是從高到低分配,堆是從低到高分配。普通單片機(jī)STM32單片機(jī)
    發(fā)表于 01-12 11:30

    ARM和單片機(jī)AVR的區(qū)別

    ARM和單片機(jī)AVR的區(qū)別 AVR單片機(jī)是ATMEL公司研制開發(fā)的一種新型單片機(jī),它與51單片機(jī)
    發(fā)表于 04-23 14:10 ?3672次閱讀

    avr單片機(jī)stm32區(qū)別與優(yōu)缺點(diǎn)分析

    摘要:avr單片機(jī)stm32單片機(jī)是目前使用較廣泛的單片機(jī),那么avr單片機(jī)stm32
    發(fā)表于 12-10 10:31 ?10.8w次閱讀
    avr<b class='flag-5'>單片機(jī)</b>和<b class='flag-5'>stm32</b><b class='flag-5'>區(qū)別</b>與優(yōu)缺點(diǎn)分析

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

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

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

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

    stm32單片機(jī)和51單片機(jī)區(qū)別是什么

    單片機(jī)也就是單片微型計(jì)算機(jī),和集CPU、RAM、ROM、輸入輸出設(shè)備、中斷系統(tǒng)在同一個(gè)芯片上的器件。 stm32單片機(jī) stm32
    的頭像 發(fā)表于 08-19 18:21 ?2.9w次閱讀

    單片機(jī)入門--常見單片機(jī)PIC\STM32

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

    單片機(jī)學(xué)習(xí)】STM32 和 51 區(qū)別

    單片機(jī)學(xué)習(xí)】STM32 和 51 區(qū)別
    發(fā)表于 11-14 15:36 ?18次下載
    【<b class='flag-5'>單片機(jī)</b>學(xué)習(xí)】<b class='flag-5'>STM32</b> 和 51 <b class='flag-5'>區(qū)別</b>

    51單片機(jī)STM32單片機(jī)區(qū)別在那里

      ?大部分朋友可能都知道51單片機(jī)stm32單片機(jī)也知道一般入門會(huì)先學(xué)習(xí)51單片機(jī)在學(xué)習(xí)stm32
    發(fā)表于 11-15 15:51 ?76次下載
    51<b class='flag-5'>單片機(jī)</b>和<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>區(qū)別</b>在那里

    51單片機(jī)堆棧深入剖析

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

    詳解STM32單片機(jī)堆棧

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

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

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

    ARM單片機(jī)STM32單片機(jī)之間有什么區(qū)別

    單片機(jī)工程師在進(jìn)行項(xiàng)目開發(fā)的時(shí)候,經(jīng)常需要進(jìn)行單片機(jī)選型,根據(jù)項(xiàng)目功能需求選擇合適的單片,這就要求對(duì)每種單片機(jī)的特點(diǎn)和優(yōu)勢非常熟悉,而ARM單片機(jī)
    的頭像 發(fā)表于 01-07 13:59 ?1.2w次閱讀

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

    根據(jù)PC的值從程序存儲(chǔ)器讀出指令,送到指令寄存器。然后分析執(zhí)行執(zhí)行。這樣單片機(jī)就從內(nèi)部程序存儲(chǔ)器去代碼指令,從RAM存取相關(guān)數(shù)據(jù)。
    發(fā)表于 01-30 11:27 ?673次閱讀

    全方位對(duì)比STM32單片機(jī)和51單片機(jī)

    萌新初入單片機(jī)領(lǐng)域,常會(huì)遇到STM32和51單片機(jī)兩大種類,無法選擇其一來提升技術(shù),也不確定哪個(gè)單片機(jī)更適合后續(xù)技術(shù)進(jìn)階提升和發(fā)展,今天這篇文將全方位對(duì)比
    發(fā)表于 03-02 14:18 ?3.3w次閱讀
    全方位對(duì)比<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>和51<b class='flag-5'>單片機(jī)</b>
    主站蜘蛛池模板: 性中国videosex国产孕妇 | 久久天天躁夜夜躁狠狠85台湾 | 你懂的福利| 老色歌uuu26| 又潮又黄的叫床视频 | zsvdy午夜片| 深爱激情站 | 久久久精品免费 | 高清成年美女黄网站色大 | 午夜视 | 天天操天天草 | 深夜免费视频 | 亚洲国产女人aaa毛片在线 | 天天看片夜夜爽 | 五月婷婷六月天 | 热re99久久国产精品 | 特级毛片女人18毛片 | 性欧美乱又伦 | 96福利视频 | 一级特一级特色生活片 | 天天做天天爱天天综合网 | 又粗又长又爽又长黄免费视频 | 四虎国产精品免费入口 | 天天狠天天插 | 日韩色中色 | 国产内地激情精品毛片在线一 | 91精品久久久久含羞草 | 午夜免费视频 | 一区二区三区高清视频在线观看 | 涩涩高清无乱码在线观看 | 国产自产视频在线观看香蕉 | 亚洲va久久久噜噜噜久久天堂 | 亚洲色图25p| 九九全国免费视频 | 俺来也婷婷 | 国外免费精品视频在线观看 | 99久久免费精品视频 | 精品理论片 | 婷五月综合 | 午夜在线观看免费高清在线播放 | 夜夜天天操 |