chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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ù)圈 ? 來(lái)源:黃工的嵌入式技術(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); //分配得來(lái)得10和20字節(jié)的區(qū)域就在堆區(qū)。 strcpy(p1, "123456"); //123456\0放在常量區(qū),編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一個(gè)地方。}

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

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

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

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

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

所以,在函數(shù)內(nèi)有較多局部變量時(shí),就需要注意是否超過(guò)我們配置的堆棧大小。

函數(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ì)占用??臻g。

3.堆(Heap)

Heap_Size EQU 0x200

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

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

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

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

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

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

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

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

而MSP指向地址0x20000668是0x20000000偏移0x668而得來(lái)。

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

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

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

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

    關(guān)注

    147

    文章

    18383

    瀏覽量

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

    關(guān)注

    0

    文章

    183

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    空閑線程堆棧出現(xiàn)內(nèi)存溢出的問(wèn)題,怎么解決?

    rtthread版本: 5.1.0 硬件: stm32f407vgt6 具體我也不知道什么原因引起的, 目前將堆棧調(diào)到1024后能為穩(wěn)定運(yùn)行 更新 設(shè)置1024堆棧, 運(yùn)行久了也不行 我有什么操作會(huì)影響到空閑線程?
    發(fā)表于 10-11 10:36

    請(qǐng)問(wèn)如何僅使用軟件和 TC375 精簡(jiǎn)板來(lái)測(cè)量函數(shù)調(diào)用的堆棧使用情況?

    我想測(cè)量 AURIX TriCore? TC3xx 項(xiàng)目的函數(shù)調(diào)用的堆棧使用情況。 我不知道怎么做。 我知道事實(shí)上作為硬件我只有一個(gè) TC375 lite 開發(fā)板,沒有 BlueBox 或任何
    發(fā)表于 08-08 07:28

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

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

    調(diào)試工具:Eclipse調(diào)試工具欄與窗口的深入分析

    摘要 :在嵌入式系統(tǒng)開發(fā)領(lǐng)域,高效的調(diào)試工具鏈對(duì)于項(xiàng)目的成功實(shí)施具有決定性意義。本文聚焦于 Eclipse 調(diào)試工具欄與窗口的功能特性,深入剖析其在嵌入式開發(fā)調(diào)試過(guò)程中的關(guān)鍵作用。以廈門國(guó)科安芯
    的頭像 發(fā)表于 07-07 11:32 ?463次閱讀
    調(diào)試工具:Eclipse調(diào)試工具欄與窗口的<b class='flag-5'>深入分析</b>

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

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

    VirtualLab應(yīng)用:亞波長(zhǎng)結(jié)構(gòu)偏振光柵的深入分析

    性和熱穩(wěn)定性是至關(guān)重要的,方法比傳統(tǒng)的基于雙折射晶體或多層系統(tǒng)的方法具有明顯的優(yōu)勢(shì)。 在本周的時(shí)事通訊中,我們對(duì)快速物理光學(xué)建模和設(shè)計(jì)軟件虛擬實(shí)驗(yàn)室融合中的這種結(jié)構(gòu)進(jìn)行了詳細(xì)的分析,使用了文獻(xiàn)[J.
    發(fā)表于 05-26 08:45

    MCU緩存設(shè)計(jì)

    從Flash或外部存儲(chǔ)器讀取的指令,減少CPU因等待指令加載而停滯,適用于實(shí)時(shí)性要求高的場(chǎng)景(如中斷服務(wù)程序)。 D-Cache?:緩存從Flash、SRAM或外部存儲(chǔ)器讀取的數(shù)據(jù),加速變量與堆棧的讀寫操作。 TCM(緊耦合內(nèi)存)?:部分MCU(如STM32H743)
    的頭像 發(fā)表于 05-07 15:29 ?664次閱讀

    MPC5777C如何在禁用其余數(shù)據(jù)緩存的同時(shí)繼續(xù)保持堆棧工作?

    我按照 AN5191指南啟動(dòng)MPC5777C自定義板,它的一些內(nèi)置測(cè)試要求我禁用緩存以執(zhí)行某些作,然后重新啟用它們以進(jìn)行正常作??紤]到我把一半的數(shù)據(jù)緩存作為我的堆棧(使用基于 dcbz 和 dcbtls 指令的 AN5191代碼),我應(yīng)該如何在禁用其余數(shù)據(jù)緩存的同時(shí)繼續(xù)保持堆棧
    發(fā)表于 03-27 06:01

    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 ?849次閱讀

    美光量產(chǎn)12層堆棧HBM,獲英偉達(dá)供應(yīng)合同

    近日,美光科技宣布即將開始量產(chǎn)其最新的12層堆棧高帶寬內(nèi)存(HBM),并將這一高性能產(chǎn)品供應(yīng)給領(lǐng)先的AI半導(dǎo)體公司英偉達(dá)。這一消息的發(fā)布,標(biāo)志著美光在HBM技術(shù)領(lǐng)域的又一次重大突破。
    的頭像 發(fā)表于 02-18 14:51 ?941次閱讀

    TechWiz LCD 2D應(yīng)用:液晶衍射分析

    有用。 1. 建模任務(wù) 1.1分析不同電壓下的衍射強(qiáng)度 1.2堆棧結(jié)構(gòu) 堆棧結(jié)構(gòu) 2. 建模過(guò)程 2.1結(jié)構(gòu)生成,其中將光學(xué)求解器設(shè)置為“Diffraction” 2.2衍射選項(xiàng)
    發(fā)表于 01-23 10:33

    AUTOSAR中通信堆棧的配置 AUTOSAR通信模塊測(cè)試方法

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

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

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

    TMS320C28x DSP上的在線堆棧溢出檢測(cè)

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