娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32單片機(jī)的堆棧深入解析

發(fā)布者:Xiangsi最新更新時(shí)間:2024-09-11 來源: elecfans關(guān)鍵字:STM32  單片機(jī)  堆棧 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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


對于了解一點(diǎn)匯編編程的人,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲區(qū)域,用來保存一些臨時(shí)數(shù)據(jù)。堆棧操作由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ī)啟動時(shí),不需要用bootloader將代碼從ROM搬移到RAM。

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

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

取執(zhí)行

分析指令

執(zhí)行指令

根據(jù)PC的值從程序存儲器讀出指令,送到指令寄存器。然后分析執(zhí)行執(zhí)行。這樣單片機(jī)就從內(nèi)部程序存儲器去代碼指令,從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ā)出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準(zhǔn)備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。

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

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

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

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

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

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

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

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

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

在IAR中,是通過工程配置堆棧大小,如下圖所示。

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)體,就會占用結(jié)構(gòu)大小空間。提示:在函數(shù)嵌套,遞歸時(shí),系統(tǒng)仍會占用棧空間。

堆(Heap)的默認(rèn)設(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大小信息:

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

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

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


關(guān)鍵字:STM32  單片機(jī)  堆棧 引用地址:STM32單片機(jī)的堆棧深入解析

上一篇:Visual Studio 2019 +STM32實(shí)現(xiàn)串口通訊
下一篇:基于STM32的甲醛濃度檢測報(bào)警proteus仿真設(shè)計(jì)

推薦閱讀最新更新時(shí)間:2025-07-02 21:57

STM32大小端序與堆棧及其增長方向分析
  在開源電子中看到一篇文章講的是棧增長和大端/小端問題。學(xué)C語言的時(shí)候,我們知道堆棧的區(qū)別:   (1)棧區(qū)(stack):由編譯器自動分配和釋放,存放函數(shù)的參數(shù)值、局部變量的值等,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。   (2)堆區(qū)(heap):一般由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收。分配方式類似于數(shù)據(jù)結(jié)構(gòu)中的鏈表。   (3)全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)自動釋放。   (4)文字常量區(qū):常量字符串就是存放在這里的。   (5)程序代碼區(qū):存放函數(shù)
[單片機(jī)]
<font color='red'>STM32</font>大小端序與<font color='red'>堆棧</font>及其增長方向分析
STM32堆棧(Heap&Stack)空間
最近做的一個(gè)項(xiàng)目遇到一個(gè)很莫名的錯誤,程序運(yùn)行到某一部分時(shí)便會卡死,分析后,感覺在邏輯上并無錯誤,但是就是會卡死,而且不是偶然。 后來在網(wǎng)上查找資料懷疑是內(nèi)存溢出,然后調(diào)試發(fā)現(xiàn)是兩個(gè)函數(shù)中的的局部變量申請的內(nèi)存空間太大,所以錯誤應(yīng)該是棧溢出了。將這兩個(gè)變量使用malloc申請堆段空間完美解決。 下面是對STM32的堆棧(Heap&Stack)小結(jié): 內(nèi)存分配空間 內(nèi)核保護(hù)區(qū) 棧段 堆段 數(shù)據(jù)區(qū) 代碼區(qū) 代碼區(qū) :靜態(tài)區(qū) 常量(const) 函數(shù)代碼邏輯 數(shù)據(jù)區(qū):靜態(tài)區(qū) 全局變量 局部變量+static 堆段:動態(tài)區(qū),管理者是程序員 malloc申請的空間 棧段:動態(tài)區(qū),管理每個(gè)子函數(shù)的空間,管理者是
[單片機(jī)]
<font color='red'>STM32</font>的<font color='red'>堆棧</font>(Heap&Stack)空間
什么是堆棧?MCS-51單片機(jī)堆棧怎樣設(shè)置的?
程序設(shè)計(jì)時(shí),往往需要一個(gè)后進(jìn)先了的RAM區(qū),以保存CPU的現(xiàn)場。這種后進(jìn)先出的緩沖區(qū),就稱為堆棧。 MCS-51單片機(jī)的堆棧原則上設(shè)在內(nèi)部RAM的任意區(qū)域內(nèi) 。但是,一般設(shè)在31H~7FH的范圍之間,棧頂?shù)奈恢糜蓷V羔楽P指出。
[單片機(jī)]
電池堆棧監(jiān)控器大幅提高混合動力汽車和電動汽車的鋰離子電池性能
鋰離子(Li-Ion)電池是電動汽車和混合動力汽車的常用儲能方法。這些電池可提供的能量密度在所有現(xiàn)有電池技術(shù)中是非常高的,但是如果要最大限度地提升性能,必須使用電池監(jiān)控系統(tǒng)(BMS)。先進(jìn)的BMS不僅使您能夠從電池組中提取大量的電荷,而且還可以以更安全的方式管理充電和放電循環(huán),從而延長使用壽命。ADI公司提供種類齊全的BMS器件組合,專注于精度和穩(wěn)健的運(yùn)行。 精確測量電池的充電狀態(tài)(SOC)可以延長電池運(yùn)行時(shí)間或減輕重量。精密穩(wěn)定的器件在PCB裝配后無需工廠校準(zhǔn)。長期穩(wěn)定性提高了安全性并可避免保修問題。自我診斷功能有助于達(dá)到合適的汽車安全完整性等級(ASIL)。電池組是充滿電磁干擾(EMI)挑戰(zhàn)的環(huán)境,因此在設(shè)計(jì)數(shù)據(jù)通信鏈路時(shí)
[嵌入式]
電池<font color='red'>堆棧</font>監(jiān)控器大幅提高混合動力汽車和電動汽車的鋰離子電池性能
鋅鐵液流儲能電站堆棧生產(chǎn)線入選武威市2024年投資機(jī)會清單
  4月8日,武威市人民政府發(fā)布《武威市2024年投資機(jī)會清單(新能源及裝備制造產(chǎn)業(yè)鏈項(xiàng)目)》,其中有1個(gè)液流電池項(xiàng)目。 序號:71 項(xiàng)目名稱:古浪縣儲能電池生產(chǎn)項(xiàng)目 項(xiàng)目概況:古浪縣位于河西走廊東端,是絲綢之路經(jīng)濟(jì)帶上的黃金節(jié)點(diǎn),縣境內(nèi)G30、G2012、國道312線、省道308線、316線和蘭新鐵路、干武鐵路縱橫交錯,正在建設(shè)的蘭張高鐵穿境而過。古浪工業(yè)集中區(qū)規(guī)劃面積25.98 平方公里,已配套建設(shè)供水、供電、排污、交通、天然氣等基礎(chǔ)設(shè)施,項(xiàng)目落地條件優(yōu)越。本項(xiàng)目擬選址在古浪工業(yè)集中區(qū)土門片區(qū),占地面積200畝,項(xiàng)目計(jì)劃引進(jìn)年產(chǎn)500MW鋅鐵液流儲能電站堆棧生產(chǎn)線及移動儲能設(shè)備充電設(shè)施設(shè)備生產(chǎn)線,建
[新能源]
開源、可重復(fù)使用的軟件堆棧助力實(shí)現(xiàn)實(shí)時(shí)處理和CbM算法開發(fā)
Open-Source, Reusable Software Stack Enables Real-Time Processing and Algorithm Development for CbM 開源、可重復(fù)使用的軟件堆棧助力實(shí)現(xiàn)實(shí)時(shí)處理和CbM算法開發(fā) CN0549狀態(tài)監(jiān)控平臺簡介 在本文中,我們將重點(diǎn)介紹CN0549的不同組件可用的軟件生態(tài)系統(tǒng)、數(shù)據(jù)分析工具和軟件集成,以及工程師和數(shù)據(jù)專家如何使用它們進(jìn)行應(yīng)用開發(fā)。我們分兩部分來介紹使用CN0549開發(fā)平臺進(jìn)行狀態(tài)監(jiān)控(CbM)和預(yù)測性維護(hù)(PdM)應(yīng)用,這是該系列文章的第二篇。新平臺旨在加快定制CbM解決方案從原型制作到生產(chǎn)的整個(gè)開發(fā)流程。第一部分主要介
[嵌入式]
開源、可重復(fù)使用的軟件<font color='red'>堆棧</font>助力實(shí)現(xiàn)實(shí)時(shí)處理和CbM算法開發(fā)
成本低、易于編程控制的DLP投影STM32單片機(jī)驅(qū)動電路研究設(shè)計(jì)
DLP投影技術(shù)是應(yīng)用美國德州儀器公司開發(fā)的數(shù)字微鏡元件--DMD(Digital Micromirror Device)作為主要關(guān)鍵處理元件以實(shí)現(xiàn)數(shù)字光學(xué)處理過程的技術(shù)。DLP顯示的色彩清晰度高、艷麗、細(xì)膩、逼真,且為全數(shù)字顯示即可靠性極高,能在各類產(chǎn)品(如大屏幕數(shù)字電視、公司/家庭/專業(yè)會議投影機(jī)和數(shù)碼相機(jī)(DLP Cinema))中提供最佳圖像效果。目前,大部分的家用或商用DLP投影機(jī)都采用了單片結(jié)構(gòu),使得其便于移動攜帶,因而得到越來越廣泛的應(yīng)用。在目前應(yīng)用發(fā)展的基礎(chǔ)上,又對其結(jié)構(gòu)的精簡性、攜帶的方便性提出了更高的要求。傳統(tǒng)的DLP投影儀是通過DVI接口接收外部信號,并且經(jīng)過信號轉(zhuǎn)換傳送給DLP控制器來控制DLP的顯示,占用的
[單片機(jī)]
成本低、易于編程控制的DLP投影<font color='red'>STM32</font><font color='red'>單片機(jī)</font>驅(qū)動電路研究設(shè)計(jì)
stm32單片機(jī)休眠模式后無法下載程序怎么辦
利用stm32單片機(jī)的休眠模式,使單片機(jī)間歇的休眠從而實(shí)現(xiàn)低功耗的目的。往往會出現(xiàn)進(jìn)入休眠后無法喚醒,導(dǎo)致下一次程序燒不進(jìn)去。通常的解決辦法是:一般的開發(fā)板或單片機(jī)最小系統(tǒng)都會有復(fù)位鍵,按住復(fù)位鍵,點(diǎn)下載,然后松開復(fù)位鍵即可。 我遇到的問題是:誤入了stm32(STM32L051C6T6)的STOP模式,又沒有寫入相應(yīng)的喚醒方法,導(dǎo)致后續(xù)的程序不能下載。使用MDK5 點(diǎn)擊load時(shí)總會出現(xiàn)No target connected。自己設(shè)計(jì)的最小系統(tǒng)又沒有加入復(fù)位鍵。。。 有以下幾種解決辦法: 1、可以將單片機(jī)的NRST引腳引出來,外接復(fù)位鍵。(關(guān)于引腳查看可用ST官方軟件STM32cubeMX,很方便) 2、通過ISP的方式
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 澄江县| 桦川县| 喜德县| 连城县| 山阳县| 介休市| 宜春市| 德令哈市| 上虞市| 溆浦县| 吉隆县| 尼勒克县| 天台县| 光山县| 田东县| 贵定县| 会同县| 安康市| 民和| 榆树市| 平湖市| 湟源县| 清水县| 浦县| 双桥区| 望谟县| 沂源县| 南漳县| 湘乡市| 江阴市| 文安县| 苗栗县| 沾益县| 增城市| 准格尔旗| 湘潭市| 盘山县| 石嘴山市| 旬邑县| 永安市| 出国|