一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

1寫在前面

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

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

對(duì)于小項(xiàng)目而言,可能我們不用關(guān)心堆棧大小。

但是,如果項(xiàng)目大了,你就要注意了,你堆棧大小設(shè)置不合理,很有可能導(dǎo)致Fault。

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

2關(guān)于堆棧的基礎(chǔ)知識(shí)

我們先看一下兩點(diǎn)經(jīng)典的知識(shí)。

1.程序的內(nèi)存分配

一個(gè)由C/C 編譯的程序占用的內(nèi)存分為以下幾個(gè)部分:

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

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

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

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

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

2.經(jīng)典例子程序

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ū),編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一個(gè)地方。}

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

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

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

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

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

2.棧(Stack)

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ì)占用棧空間。

3.堆(Heap)

Heap_Size EQU 0x200

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

我們大部分人應(yīng)該很少使用malloc來分配堆空間。

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

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

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

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

這個(gè)大小為0x668,在進(jìn)行在調(diào)試時(shí),會(huì)出現(xiàn):

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

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

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

當(dāng)然,關(guān)于map文件詳細(xì)分析,可以看我系列教程Keil系列教程12_map文件全面解析》。

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

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

    關(guān)注

    146

    文章

    17984

    瀏覽量

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

    關(guān)注

    0

    文章

    183

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    深入分析小智AI現(xiàn)象級(jí)項(xiàng)目背后的成功密碼

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

    S32DS3.5是否支持堆棧保護(hù)?

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

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

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

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

    )的開發(fā)和生產(chǎn)。通信堆棧是AUTOSAR架構(gòu)中的關(guān)鍵組成部分,負(fù)責(zé)處理ECU之間的通信。 AUTOSAR中通信堆棧的配置 通信模型 : AUTOSAR定義了一種分層的通信模型,包括應(yīng)用層、診斷層、網(wǎng)絡(luò)
    的頭像 發(fā)表于 12-17 15:01 ?991次閱讀

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

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

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

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

    將一個(gè)第15.4層堆棧傳感器連接到多個(gè)網(wǎng)關(guān)

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

    使用Simplelink無線MCU系列克隆Z堆棧網(wǎng)絡(luò)屬性

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

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

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

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

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

    德州儀器(TI)Wi-SUN? 堆棧:幀計(jì)數(shù)器驗(yàn)證缺失

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

    堆棧和內(nèi)存的基本知識(shí)

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

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

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

    xTaskCreate能否把堆棧上限調(diào)整為2K或者1k?

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