99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

1寫在前面

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

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

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

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

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

2關于堆棧的基礎知識

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

1.程序的內存分配

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

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

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

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

文字常量區(qū):常量字符串就是放在這里的,程序結束后由系統(tǒng)釋放。

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

2.經典例子程序

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

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

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

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

1.如何設置STM32的堆棧大?。?/p>

這個問題在文章《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字節(jié)的??臻g。

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

函數參數:

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

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

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

3.堆(Heap)

Heap_Size EQU 0x200

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

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

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

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

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

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

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

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

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

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

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

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

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

    關注

    146

    文章

    17984

    瀏覽量

    367123
  • 堆棧
    +關注

    關注

    0

    文章

    183

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    TC397XX如何使用 EB 堆棧處理 IRQ?

    我們正在使用 TC397XX。我遇到的問題是 EB Stack 中沒有 IRQ 驅動程序。那么,我們如何使用 EB 堆棧處理 IRQ。 從哪個 AUTOSAR 版本開始,IRQ 驅動程序被刪除了?
    發(fā)表于 07-15 06:20

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    C2000?MCU的運行時堆棧大小監(jiān)測

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

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

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

    堆棧和內存的基本知識

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

    如何使用Polyspace Code Prover來統(tǒng)計堆棧

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

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

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