在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取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

    文章

    17148

    瀏覽量

    351198
  • 堆棧
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19761
收藏 人收藏

    評論

    相關推薦

    使用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>監測

    堆棧和內存的基本知識

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

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

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

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

    發送大量與 malloc/free 相關的調試消息后,任務的堆棧之一已溢出。 我的問題是,誰能告訴我為什么除了調用ets_printf本身之外,堆棧還會發揮作用
    發表于 07-09 07:47

    esp32如何實現一個set_stack設置堆棧的接口?

    剛剛開始玩esp32,在移植自己的系統,需要實現一個set_stack設置堆棧的接口。 static ALWAYS_INLINE void vsf_arch_set_stack(uint32_t
    發表于 06-24 06:26

    esp32S2創建任務時,若任務堆棧大小配置超過 4096*6 ,任務會創建失敗,如何解決?

    esp32S2創建任務時,若任務堆棧大小配置超過 4096*6 ,任務會創建失敗, xTaskCreat 返回 xReturn = ffffffff。是否應該修改FreeRTOSConfig.h中
    發表于 06-20 08:26

    求助,關于stm32f1使用freeRTOS和Fatfs時任務堆棧大小問題求解

    哪位使用過freeRTOS和Fatfs時,使用Fatfs系統的函數如f_open()等等時,此任務的堆棧大小大致需要多大,當前MAX_SS 定義為4096,我分配12K軟件都跑飛了,請哪位使用分享一下經驗,謝謝!~~?
    發表于 05-09 06:50

    使用STM32CubeIDE修改堆棧大小后,生成的BIN文件內容沒變化是怎么回事?

    bin文件升級的方式來改變目標板的堆棧大小配置,如果bin文件不變,豈不是通過升級bin的方式改變不了堆棧大小了? 煩請大家指教,謝謝!
    發表于 04-07 06:11

    TLE9893如何配置堆棧溢出檢測?

    的 startup_tle989x.s 文件為堆棧分配的大小為 512 字節: 此外,在主入口點,堆棧指針寄存器的值為 0x180023b0,所以我猜這是堆棧指針的初始值。 我寫了以
    發表于 01-19 06:11

    通用Tensilica軟件堆棧提供最佳邊緣AI性能

    開發敏捷的軟件堆棧對 AI 在邊緣側的成功部署非常重要。
    的頭像 發表于 01-18 13:39 ?780次閱讀
    通用Tensilica軟件<b class='flag-5'>堆棧</b>提供最佳邊緣AI性能

    請問如何使用ModusToolbox?估計應用程序使用的堆棧和堆空間量?

    我正在使用 PSoC63 進行 ModusToolbox? 開發。 運行我的應用程序時,MTB上是否有任何方法可以確定或估計我的應用程序將使用的最大堆棧和堆大小? 謝謝。
    發表于 01-18 08:04

    深入分析運放的作用

    深入分析了4-20mA的運放選型、A/D基準電壓對測量精度影響等問題。
    的頭像 發表于 01-15 13:47 ?3685次閱讀
    <b class='flag-5'>深入分析</b>運放的<b class='flag-5'>作用</b>

    嵌入式系統中堆棧監控的作用

    在微控制器或微處理器中,堆棧是內存的一個保留區域,用于存儲臨時數據和函數調用信息,管理函數的執行,跟蹤返回地址、局部變量和函數參數。堆棧監控是嵌入式系統運行中起關鍵作用的一項安全措施,促進了嵌入式系統的整體安全性和穩定性。
    的頭像 發表于 01-05 11:13 ?498次閱讀
    主站蜘蛛池模板: 直接观看黄网站免费视频| 免费高清在线观看a网站| 美女黄色毛片| 午夜视频网址| 色偷偷91久久综合噜噜噜噜| 天堂网欧美| 国产精品怡红院永久免费| 久热久操| 男人性天堂| 五月婷婷激情五月| 免费久久精品国产片香蕉| 三级网址在线播放| 快色视频免费| 深夜久久| 久久精品免费在线观看| 嫩草影院在线入口| 成人亚洲综合| bt天堂新版中文在线地址| 亚洲成年人影院| 丁香月婷婷| 热门国产xvideos中文| 涩综合| 亚洲一区二区三区在线播放| 一品毛片| 国产女人和拘做受视频免费| 成人影院在线观看视频| 性欧美久久| 97影院理论片在线观看| www.91大神| 欧美色视频网站| 人人插人人干| 这里只有精品视频| 国产好深好硬好爽我还要视频| 日本69sex护士xxx| 日韩亚洲人成网站在线播放| 国产精品久久久久久久久福利| h视频日本| 日本色午夜| 又黄又爽的成人免费网站 | avtt亚洲一区中文字幕| 欧美性淫爽www视频播放|