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

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

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

3天內不再提示

深入分析MCU堆棧的作用 以及該如何設置堆棧大小

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 作者:黃工的嵌入式技術 ? 2020-03-01 14:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1寫在前面

我們都知道堆棧位于RAM中,現在MCU的RAM相對較大(幾十上百K),所以分配的堆棧也是足夠大,很多人都不怎么關注這個堆棧的大小。

但是,以前MCU的RAM比較小,甚至1K都不到,所以,以前的工程師就比較關心堆棧的大小。

對于小項目而言,可能我們不用關心堆棧大小。

但是,如果項目大了,你就要注意了,你堆棧大小設置不合理,很有可能導致Fault。

想要知道堆棧有多大才合適,你就需要明白堆棧的作用,下面讓大家進一步了解堆棧。

2關于堆棧的基礎知識

我們先看一下兩點經典的知識。

1.程序的內存分配

一個由C/C 編譯的程序占用的內存分為以下幾個部分:

棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。

堆區(heap):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式類似于鏈表。

全局區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束后由系統釋放。

文字常量區:常量字符串就是放在這里的,程序結束后由系統釋放。

程序代碼區:存放函數體的二進制代碼。

2.經典例子程序

int a = 0; //全局初始化區char *p1; //全局未初始化區main(){ int b; //棧 char s[] = "abc"; //棧 char *p2; //棧 char *p3 = "123456"; //123456\0在常量區,p3在棧上。 static int c =0;//全局(靜態)初始化區 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得來得10和20字節的區域就在堆區。 strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。}

3結合STM32的開發講述堆棧

從上面的描述可以看得出來,在代碼中是如何占用堆和棧的。

可能很多人還是無法理解,這里再結合STM32的開發過程中與堆棧相關的內容來進行講述。

1.如何設置STM32的堆棧大小?

這個問題在文章《STM32的啟動流程到底是怎樣的?》中,講述了在MDK-ARM、IAREWARM,以及使用STM32CubeMX設置堆棧大小的方法。

2.棧(Stack)

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

Stack_Size EQU 0x400

函數體內局部變量:

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

局部變量總共占用了256*4 + 1字節的棧空間。

所以,在函數內有較多局部變量時,就需要注意是否超過我們配置的堆棧大小。

函數參數:

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

這里要強調一點:傳遞指針只占4字節,如果傳遞的是結構體,就會占用結構大小空間。

提示:在函數嵌套,遞歸時,系統仍會占用棧空間。

3.堆(Heap)

Heap_Size EQU 0x200

默認設置0x200(512)字節。

我們大部分人應該很少使用malloc來分配堆空間。

雖然堆上的數據只要程序員不釋放空間就可以一直訪問,但是,如果忘記了釋放堆內存,那么將會造成內存泄漏,甚至致命的潛在錯誤。

4拓展:MDK中RAM占用大小分析

經常在線調試的人,可能會分析一些底層的內容。這里結合MDK-ARM來分析一下RAM占用大小的問題。

在MDK編譯之后,會有一段RAM大小信息:

這個大小為0x668,在進行在調試時,會出現:

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

而MSP指向地址0x20000668是0x20000000偏移0x668而得來。

具體哪些地方占用了RAM,可以參看map文件中【Image Symbol Table】處的內容:

當然,關于map文件詳細分析,可以看我系列教程Keil系列教程12_map文件全面解析》。

關于堆棧,其實還有很多知識可以拓展,比如:堆棧入棧、出棧,向上、向下增長方式,大小端等。大家可以自己上網了解。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17953

    瀏覽量

    365002
  • 堆棧
    +關注

    關注

    0

    文章

    183

    瀏覽量

    20108
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深入分析小智AI現象級項目背后的成功密碼

    創新技術,實現了從"冰冷機器"到"情感伙伴"的跨越。更重要的是,其開源戰略不僅降低了AI硬件的開發門檻,還構建了一個活躍的全球開發者生態,催生出超過30萬臺硬件設備接入,日對話量突破90萬條的驚人成績。本文將深入分析小智AI的技術
    的頭像 發表于 07-02 10:54 ?963次閱讀

    S32DS3.5是否支持堆棧保護?

    我想知道 S32DS3.5 是否支持堆棧保護?
    發表于 03-21 08:28

    L-com推出USB雙層堆棧式耦合器線纜組件

    為了快速提升客戶在有限空間內機架、面板的連接器密度,L-com推出了一系列USB雙層堆棧式耦合器線纜組件。
    的頭像 發表于 02-27 18:09 ?654次閱讀

    AUTOSAR中通信堆棧的配置 AUTOSAR通信模塊測試方法

    )的開發和生產。通信堆棧是AUTOSAR架構中的關鍵組成部分,負責處理ECU之間的通信。 AUTOSAR中通信堆棧的配置 通信模型 : AUTOSAR定義了一種分層的通信模型,包括應用層、診斷層、網絡
    的頭像 發表于 12-17 15:01 ?942次閱讀

    L-com推出新型USB雙層堆棧式耦合器線纜組件

    為了快速提升客戶在有限空間內機架、面板的連接器密度,L-com推出了一系列新型USB雙層堆棧式耦合器線纜組件。
    的頭像 發表于 11-22 09:14 ?627次閱讀

    TMS320C28x DSP上的在線堆棧溢出檢測

    電子發燒友網站提供《TMS320C28x DSP上的在線堆棧溢出檢測.pdf》資料免費下載
    發表于 10-18 11:16 ?1次下載
    TMS320C28x DSP上的在線<b class='flag-5'>堆棧</b>溢出檢測

    將一個第15.4層堆棧傳感器連接到多個網關

    電子發燒友網站提供《將一個第15.4層堆棧傳感器連接到多個網關.pdf》資料免費下載
    發表于 09-26 11:05 ?0次下載
    將一個第15.4層<b class='flag-5'>堆棧</b>傳感器連接到多個網關

    使用Simplelink無線MCU系列克隆Z堆棧網絡屬性

    電子發燒友網站提供《使用Simplelink無線MCU系列克隆Z堆棧網絡屬性.pdf》資料免費下載
    發表于 09-26 10:57 ?0次下載
    使用Simplelink無線<b class='flag-5'>MCU</b>系列克隆Z<b class='flag-5'>堆棧</b>網絡屬性

    使用Simplelink?無線MCU系列測量堆棧終端器件功耗

    電子發燒友網站提供《使用Simplelink?無線MCU系列測量堆棧終端器件功耗.pdf》資料免費下載
    發表于 09-26 10:44 ?0次下載
    使用Simplelink?無線<b class='flag-5'>MCU</b>系列測量<b class='flag-5'>堆棧</b>終端器件功耗

    C2000?MCU的運行時堆棧大小監測

    電子發燒友網站提供《C2000?MCU的運行時堆棧大小監測.pdf》資料免費下載
    發表于 09-11 09:30 ?0次下載
    C2000?<b class='flag-5'>MCU</b>的運行時<b class='flag-5'>堆棧</b><b class='flag-5'>大小</b>監測

    德州儀器(TI)Wi-SUN? 堆棧:幀計數器驗證缺失

    電子發燒友網站提供《德州儀器(TI)Wi-SUN? 堆棧:幀計數器驗證缺失.pdf》資料免費下載
    發表于 09-06 11:31 ?0次下載
    德州儀器(TI)Wi-SUN? <b class='flag-5'>堆棧</b>:幀計數器驗證缺失

    堆棧和內存的基本知識

    本文主要聊聊關于堆棧的內容。包括堆棧和內存的基本知識。常見和堆棧相關的 bug,如棧溢出,內存泄漏,堆內存分配失敗等。后面介紹軟件中堆棧統計的重要性,
    的頭像 發表于 08-29 14:10 ?1032次閱讀
    <b class='flag-5'>堆棧</b>和內存的基本知識

    如何使用Polyspace Code Prover來統計堆棧

    前一篇文章介紹了堆棧和內存的一些背景知識。本次介紹如何使用 Polyspace Code Prover來統計堆棧,如何使用這些數據為軟件優化服務。
    的頭像 發表于 07-25 14:06 ?1237次閱讀
    如何使用Polyspace Code Prover來統計<b class='flag-5'>堆棧</b>

    xTaskCreate能否把堆棧上限調整為2K或者1k?

    RTOS SDK 的系統任務優先級為 15 ,創建任務的接?口 xTaskCreate 為 freeRTOS ?自帶接?口,使 ?用 xTaskCreate 創建任務時,任務堆棧設置范圍為 [176, 512]。 能否把堆棧
    發表于 07-22 06:31

    請問est_printf為什么要使用堆棧空間?

    發送大量與 malloc/free 相關的調試消息后,任務的堆棧之一已溢出。 我的問題是,誰能告訴我為什么除了調用ets_printf本身之外,堆棧還會發揮作用
    發表于 07-09 07:47
    主站蜘蛛池模板: 四虎永久在线精品国产免费 | 国产在线精品亚洲另类 | 本庄优花aⅴ全部在线影片 被滋润的艳妇疯狂呻吟白洁老七 | 久久香蕉国产线看观看首页 | tobu中国日本高清 | 男女全黄h全肉细节文 | 在线中文字幕亚洲日韩 | 九九热这里只有精品视频免费 | 久久精品国产亚洲AV未满十八 | 久爱在线中文在观看 | 一本二卡三卡四卡乱码麻豆 | 蜜芽资源高清在线观看 | 看美女大腿中间的部分 | 亚州AV人片一区二区三区99久 | 成片在线看一区二区草莓 | 在线播放免费人成毛片视频 | 国产成人a一在线观看 | 亚洲一级毛片免费在线观看 | 久久久久久久久免费视频 | 父亲在线日本综艺免费观看全集 | 亚洲福利电影一区二区? | 国产h视频免费观看 | 99久久国产极品蜜臀AV酒店 | 中文日韩亚洲欧美字幕 | 美国女孩毛片 | 十分钟在线观看免费视频高清WWW | 日本综艺大尺度无删减版在线 | 俄罗斯女人Z0Z0极品 | 免费看到湿的小黄文软件APP | 黄A无码片内射无码视频 | 午夜福利影院私人爽爽 | 国产精品嫩草久久久久 | 亚洲2023无矿砖码砖区 | 亚洲精品123区在线观看 | 色欲午夜无码久久久久久 | thermo脱色摇床安卓下载 | 全部老头和老太XXXXX | 有人有片的观看免费视频 | 尤物国产在线精品三区 | 成人毛片在线播放 | 双手绑在床头调教乳尖 |

    電子發燒友

    中國電子工程師最喜歡的網站

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