亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

STM32單片機中堆棧的的示例分析

發布時間:2021-12-27 11:04:17 來源:億速云 閱讀:248 作者:小新 欄目:互聯網科技

小編給大家分享一下STM32單片機中堆棧的的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

    對于了解一點匯編編程的人,就可以知道,堆棧是內存中一段連續的存儲區域,用來保存一些臨時數據。堆棧操作由PUSH、POP兩條指令來完成。而程序內存可以分為幾個區:

  • 棧區(stack)

  • 堆區(Heap)

  • 全局區(static)

    程序編譯之后,全局變量,靜態變量已經分配好內存空間,在函數運行時,程序需要為局部變量分配棧空間,當中斷來時,也需要將函數指針入棧,保護現場,以便于中斷處理完之后再回到之前執行的函數。  
    棧是從高到低分配,堆是從低到高分配。
普通單片機與STM32單片機中堆棧的區別
    普通單片機啟動時,不需要用bootloader將數據 從ROM搬移到RAM。但是STM32單片機需要。這里我們可以先看看單片機程序執行的過程,單片機執行分三個步驟:
  • 取執行
  • 分析指令
  • 執行指令
    根據PC的值從程序存儲器讀出指令,送到指令寄存器。然后分析執行執行。這樣單片機就從內部程序存儲器去代碼指令,從RAM存取相關數據。
    RAM取數的速度是遠高于ROM的,但是普通單片機因為本身運行頻率不高,所以從ROM取指令慢并不影響。
    而STM32的CPU運行的頻率高,遠大于從ROM讀寫的速度。所以需要用bootloader將數據 從ROM搬移到RAM。
    使用棧就像我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。
    其實堆棧就是單片機中的一些存儲單元,這些存儲單元被指定保存一些特殊信息,比如地址(保護斷點)和數據(保護現場)。
    如果非要給他加幾個特點的話那就是:
  • 這些存儲單元中的內容都是程序執行過程中被中斷打斷時,事故現場的一些相關參數。如果不保存這些參數,單片機執行完中斷函數后就無法回到主程序繼續執行了。
  • 這些存儲單元的地址被記在了一個叫做堆棧指針(SP)的地方。
 

結合STM32的開發講述堆棧

    從上面的描述可以看得出來,在代碼中是如何占用堆和棧的。可能很多人還是無法理解,這里再結合STM32的開發過程中與堆棧相關的內容來進行講述。

    如何設置STM32的堆棧大小?
    在基于MDK的啟動文件開始,有一段匯編代碼是分配堆棧大小的。
STM32單片機中堆棧的的示例分析
    這里重點知道堆棧數值大小就行。還有一段AREA(區域),表示分配一段堆棧數據段。數值大小可以自己修改,也可以使用STM32CubeMX數值大小配置,如下圖所示。

STM32單片機中堆棧的的示例分析

    在IAR中,是通過工程配置堆棧大小,如下圖所示。

STM32單片機中堆棧的的示例分析

    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字節,如果傳遞的是結構體,就會占用結構大小空間。提示:在函數嵌套,遞歸時,系統仍會占用棧空間。

    堆(Heap)的默認設置0x200(512)字節。

Heap_Size EQU 0x200

    大部分人應該很少使用malloc來分配堆空間。雖然堆上的數據只要程序員不釋放空間就可以一直訪問,但是,如果忘記了釋放堆內存,那么將會造成內存泄漏,甚至致命的潛在錯誤。

 

MDK中RAM占用大小分析

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

STM32單片機中堆棧的的示例分析

    這里4+6=1640,轉換成16進制就是0x668,在進行在調試時,會出現:

STM32單片機中堆棧的的示例分析

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

STM32單片機中堆棧的的示例分析

    而MSP指向地址0x20000668是0x20000000偏移0x668而得來。具體哪些地方占用了RAM,可以參看map文件中【Image Symbol Table】處的內容:

STM32單片機中堆棧的的示例分析

看完了這篇文章,相信你對“STM32單片機中堆棧的的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海晏县| 班戈县| 安福县| 烟台市| 安乡县| 紫云| 晋宁县| 汨罗市| 肥东县| 靖宇县| 镇原县| 高要市| 禄劝| 那坡县| 隆化县| 华坪县| 宁安市| 定安县| 镶黄旗| 莱西市| 邻水| 长岭县| 长宁县| 卓尼县| 呼伦贝尔市| 大关县| 称多县| 班戈县| 高台县| 四川省| 惠来县| 沂源县| 福清市| 平乡县| 于田县| 将乐县| 玛曲县| 鹰潭市| 奇台县| 钟山县| 阳城县|