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

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

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

詳細(xì)解析STM32中的堆棧機(jī)制

貿(mào)澤電子設(shè)計(jì)圈 ? 2018-01-15 15:03 ? 次閱讀

剛拿到STM32時(shí),你只編寫一個(gè)死循環(huán)

詳細(xì)解析STM32中的堆棧機(jī)制

編譯后,就會(huì)發(fā)現(xiàn)這么個(gè)程序已用了1600多的RAM,這要是在51單片機(jī)上,會(huì)心疼死了,這1600多的RAM跑哪兒去了,分析.map文件,你會(huì)發(fā)現(xiàn)是堆和棧占用的

在startup_stm32f10x_md.s文件中,它的前面幾行就有以下定義:

詳細(xì)解析STM32中的堆棧機(jī)制

這下明白了吧,STM32在啟動(dòng)的時(shí)候,RAM首先分配給使用到的全局變量,還有調(diào)用庫占用的一些數(shù)據(jù)(不太清楚是什么數(shù)據(jù)),然后再將剩余的空間分配給Heap和Stack。由于內(nèi)存空間是啟動(dòng)時(shí)實(shí)現(xiàn)分配好的,所以當(dāng)動(dòng)態(tài)分配內(nèi)存的需求過多的時(shí)候,就會(huì)產(chǎn)生堆棧空間不足的問題。

查閱網(wǎng)上的資料,理解堆和棧的區(qū)別:

- (1)棧區(qū)(stack):由編譯器自動(dòng)分配和釋放,存放函數(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)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)自動(dòng)釋放。

- (4)文字常量區(qū):常量字符串就是存放在這里的。

- (5)程序代碼區(qū):存放函數(shù)體的二進(jìn)制代碼。

例如:

詳細(xì)解析STM32中的堆棧機(jī)制

所以堆和棧的區(qū)別:

- stack的空間由操作系統(tǒng)自動(dòng)分配/釋放,heap上的空間手動(dòng)分配/釋放。

- stack的空間有限,heap是很大的自由存儲(chǔ)區(qū)。

- 程序在編譯期和函數(shù)分配內(nèi)存都是在棧上進(jìn)行,且程序運(yùn)行中函數(shù)調(diào)用時(shí)參數(shù)的傳遞也是在棧上進(jìn)行。

顯然 Cortex-m3資料可知:__initial_sp是堆棧指針,它就是FLASH的0x8000000地址前面4個(gè)字節(jié)(它根據(jù)堆棧大小,由編譯器自動(dòng)生成)顯然堆和棧是相鄰的。

堆和??臻g分配:

- 棧:向低地址擴(kuò)展- 堆:向高地址擴(kuò)展

顯然如果依次定義變量,先定義的棧變量的內(nèi)存地址比后定義的棧變量的內(nèi)存地址要大,先定義的堆變量的內(nèi)存地址比后定義的堆變量的內(nèi)存地址要小。

堆和棧變量:

- 棧:臨時(shí)變量,退出該作用域就會(huì)自動(dòng)釋放- 堆:malloc變量,通過free函數(shù)釋放

寫程序時(shí)應(yīng)該注意:

1. 所以最好是不要調(diào)用太深。2. 局部變量不要太大太多,如局部數(shù)組,超過某個(gè)數(shù)量需定義為全局?jǐn)?shù)組,因?yàn)榫植繑?shù)組同樣儲(chǔ)存在堆棧中。

聲明:本文內(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)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

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

    關(guān)注

    0

    文章

    182

    瀏覽量

    19717

原文標(biāo)題:再次理解STM32中的堆棧機(jī)制,通俗易懂~

文章出處:【微信號(hào):Mouser-Community,微信公眾號(hào):貿(mào)澤電子設(shè)計(jì)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詳細(xì)解析STM32的外部中斷

    說明:本文旨在詳細(xì)解析STM32的外部中斷,以實(shí)現(xiàn)按鍵觸發(fā)外部中斷。其中包含“編程流程”、“程序代碼”、“代碼解析”、“原理分析”、“小結(jié)”五部分。一、編程流程要實(shí)現(xiàn)
    發(fā)表于 08-13 07:50

    FreeRTOS的任務(wù)堆棧溢出檢測機(jī)制

    合理的任務(wù)堆棧大小,并實(shí)際運(yùn)行程序進(jìn)行測試,來確保系統(tǒng)運(yùn)行過程不會(huì)發(fā)生堆棧溢出。FreeRTOS的任務(wù)堆棧溢出檢測
    發(fā)表于 10-15 13:51

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

    這個(gè)是MDK編譯之后能夠得到的每個(gè)段的大小,也就能得到占用相應(yīng)的FLASH和RAM的大小,但是還有兩個(gè)數(shù)據(jù)段也會(huì)占用RAM,但是是在程序運(yùn)行的時(shí)候,才會(huì)占用,那就是堆和棧。在stm32的啟動(dòng)文件.s
    的頭像 發(fā)表于 03-29 13:45 ?1.3w次閱讀

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

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

    STM32堆棧及其在uC/OS-II的使用

    STM32堆棧及其在uC/OS-II的使用 說明:里面可能有不少錯(cuò)誤的觀念,希望大家發(fā)現(xiàn)后及時(shí)的糾正。 首先了解一下雙堆棧的知識(shí),下面的圖片來自《Cortex-M3權(quán)威指南》,有點(diǎn)
    發(fā)表于 09-08 16:59 ?366次閱讀

    基于STM32單片機(jī)低功耗模式機(jī)制詳細(xì)解析

    本文主要解讀STM32低功耗模式的機(jī)制,并不側(cè)重STM32低功耗的程序?qū)崿F(xiàn),而且借助STM32固件庫實(shí)現(xiàn)STM32低功耗會(huì)變的非常簡單。
    發(fā)表于 10-24 16:16 ?1.9w次閱讀
    基于<b class='flag-5'>STM32</b>單片機(jī)低功耗模式<b class='flag-5'>機(jī)制</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解析</b>

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

    學(xué)習(xí)STM32單片機(jī)的時(shí)候,總是能遇到堆棧這個(gè)概念。分享本文,希望對(duì)你理解堆棧有幫助。 對(duì)于了解一點(diǎn)匯編編程的人,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲(chǔ)區(qū)域,用來保存一些臨時(shí)數(shù)據(jù)。
    的頭像 發(fā)表于 10-30 17:31 ?4674次閱讀
    <b class='flag-5'>STM32</b>單片機(jī)的<b class='flag-5'>堆棧</b>深入<b class='flag-5'>解析</b>

    深度解析Asp.Net2.0的Callback機(jī)制

    深度解析Asp.Net2.0的Callback機(jī)制(ups電源技術(shù)維修)-該文檔為深度解析Asp.Net2.0的Callback
    發(fā)表于 09-27 16:28 ?1次下載
    深度<b class='flag-5'>解析</b>Asp.Net2.0<b class='flag-5'>中</b>的Callback<b class='flag-5'>機(jī)制</b>

    STM32堆棧空間大小設(shè)置

    1. 設(shè)置堆棧空間大小在使用STM32編程時(shí),一般情況下我們不會(huì)關(guān)注堆棧空間的大小,因?yàn)樵?b class='flag-5'>STM32的啟動(dòng)文件,已經(jīng)幫我們預(yù)先設(shè)置好了
    發(fā)表于 12-17 18:36 ?11次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>堆棧</b>空間大小設(shè)置

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

    1. 設(shè)置堆棧空間大小在使用STM32編程時(shí),一般情況下我們不會(huì)關(guān)注堆棧空間的大小,因?yàn)樵?b class='flag-5'>STM32的啟動(dòng)文件,已經(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)致死機(jī))

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

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

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

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

    詳解C/C++堆棧的工作機(jī)制

    我們經(jīng)常會(huì)討論這樣的問題:什么時(shí)候數(shù)據(jù)存儲(chǔ)在堆棧(Stack),什么時(shí)候數(shù)據(jù)存儲(chǔ)在堆(Heap)。我們知道,局部變量是存儲(chǔ)在堆棧的;d
    的頭像 發(fā)表于 07-29 09:09 ?1093次閱讀

    STM32WB BLE 堆棧編程指南

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

    一文解析LinuxARP學(xué)習(xí)和老化機(jī)制

    ARP學(xué)習(xí)和老化機(jī)制在Linux網(wǎng)絡(luò)通信中起著至關(guān)重要的作用。ARP(Address Resolution Protocol)地址解析協(xié)議是將IP地址解析為MAC地址的一種機(jī)制。
    發(fā)表于 08-04 16:55 ?1384次閱讀