您好,登錄后才能下訂單哦!
小編給大家分享一下STM32單片機中堆棧的的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
對于了解一點匯編編程的人,就可以知道,堆棧是內存中一段連續的存儲區域,用來保存一些臨時數據。堆棧操作由PUSH、POP兩條指令來完成。而程序內存可以分為幾個區:
棧區(stack)
堆區(Heap)
全局區(static)
從上面的描述可以看得出來,在代碼中是如何占用堆和棧的。可能很多人還是無法理解,這里再結合STM32的開發過程中與堆棧相關的內容來進行講述。
在IAR中,是通過工程配置堆棧大小,如下圖所示。
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-ARM來分析一下RAM占用大小的問題。在MDK編譯之后,會有一段RAM大小信息:
這里4+6=1640,轉換成16進制就是0x668,在進行在調試時,會出現:
這個MSP就是主堆棧指針,一般我們復位之后指向的位置,復位指向的其實是棧頂:
而MSP指向地址0x20000668是0x20000000偏移0x668而得來。具體哪些地方占用了RAM,可以參看map文件中【Image Symbol Table】處的內容:
看完了這篇文章,相信你對“STM32單片機中堆棧的的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。