国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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
    +關注

    關注

    147

    文章

    18924

    瀏覽量

    398025
  • 堆棧
    +關注

    關注

    0

    文章

    183

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    探索LTC6803-1/LTC6803-3多節電池堆棧監測器:特性、應用與設計要點

    探索LTC6803-1/LTC6803-3多節電池堆棧監測器:特性、應用與設計要點 大家好,我是一名電子工程師,在硬件設計開發領域摸爬滾打多年。今天我想和大家深入探討一下LTC6803-1
    的頭像 發表于 02-24 15:10 ?92次閱讀

    深入剖析LTC6813 - 1:多節電池堆棧監測的理想選擇

    深入剖析LTC6813 - 1:多節電池堆棧監測的理想選擇 作為一名電子工程師,在設計電池管理系統時,高效、精確的電池監測芯片至關重要。今天,咱們就來深入探討一款優秀的電池監測芯片——LTC6813
    的頭像 發表于 02-24 11:10 ?193次閱讀

    深入剖析LTC6810-1/LTC6810-2:6通道電池堆棧監控器的卓越之選

    深入剖析LTC6810-1/LTC6810-2:6通道電池堆棧監控器的卓越之選 在電子工程師的日常工作中,電池管理系統的設計至關重要,而一款優秀的電池堆棧監控器能為系統的穩定性和可靠性提供有
    的頭像 發表于 02-12 16:45 ?2436次閱讀

    在學單片機時在堆棧遇到的問題分享

    溢出。在Target的頁面中有一個Return Stack Sizi選項,用于指定硬件堆棧(保存函數返回值)的大小,通常如果子程序調用嵌套不深(不超過4層),那么使用默認的16字節就足夠了,如果使用了
    發表于 01-23 07:47

    堆棧的原理揭秘

    局部變量的大小,將堆棧寄存器esp的值下移,即可留出對應的空間用于存儲變量。而刪除時,只需要將當前ebp的值賦給esp【即將棧頂指針直接壓倒棧底】,即可自動將所有與該函數相關的局部變量清空,將所占用空間
    發表于 01-23 07:08

    單片機堆棧解析

    什么是單片機堆棧? 在片內RAM中,常常要指定一個專門的區域來存放某些特別的數據,它遵循順序存取和后進先出(LIFO/FILO)的原則,這個RAM區叫堆棧。 它的作用 子程序調用和中斷服務時CPU
    發表于 12-09 06:52

    請問如何利用 Keil 分析 MCU 堆棧空間?

    如何利用 Keil 分析 MCU 堆棧空間?
    發表于 11-26 07:38

    堆棧的定義,堆棧的使用方法

    堆棧的定義 堆棧也是用戶使用的存儲器的一部分,用于存放臨時性的數據和一些其他信息。堆棧段的定義語法如下: 堆棧名SEGMENTSTACK (
    發表于 11-21 06:49

    堆棧指針SP介紹

    =07H,不用重新賦值也是可以的,否則,為什么當初設計者會這么設計呢。由于51單片機的堆棧是向上增長的,所以,為了避免堆棧區與用戶數據區互相影響,才將SP設置在60H以后,比較合理的是賦值為6FH,這樣
    發表于 11-17 06:07

    空閑線程堆棧出現內存溢出的問題,怎么解決?

    rtthread版本: 5.1.0 硬件: stm32f407vgt6 具體我也不知道什么原因引起的, 目前將堆棧調到1024后能為穩定運行 更新 設置1024堆棧, 運行久了也不行 我有什么操作會影響到空閑線程?
    發表于 10-11 10:36

    請問如何僅使用軟件和 TC375 精簡板來測量函數調用的堆棧使用情況?

    我想測量 AURIX TriCore? TC3xx 項目的函數調用的堆棧使用情況。 我不知道怎么做。 我知道事實上作為硬件我只有一個 TC375 lite 開發板,沒有 BlueBox 或任何
    發表于 08-08 07:28

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

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

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

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

    MPC5777C如何在禁用其余數據緩存的同時繼續保持堆棧工作?

    我按照 AN5191指南啟動MPC5777C自定義板,它的一些內置測試要求我禁用緩存以執行某些作,然后重新啟用它們以進行正常作。考慮到我把一半的數據緩存作為我的堆棧(使用基于 dcbz 和 dcbtls 指令的 AN5191代碼),我應該如何在禁用其余數據緩存的同時繼續保持堆棧
    發表于 03-27 06:01

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

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