您好,登錄后才能下訂單哦!
小編給大家分享一下STM32單片機(jī)中堆棧的的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
對(duì)于了解一點(diǎn)匯編編程的人,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲(chǔ)區(qū)域,用來(lái)保存一些臨時(shí)數(shù)據(jù)。堆棧操作由PUSH、POP兩條指令來(lái)完成。而程序內(nèi)存可以分為幾個(gè)區(qū):
棧區(qū)(stack)
堆區(qū)(Heap)
全局區(qū)(static)
從上面的描述可以看得出來(lái),在代碼中是如何占用堆和棧的??赡芎芏嗳诉€是無(wú)法理解,這里再結(jié)合STM32的開(kāi)發(fā)過(guò)程中與堆棧相關(guān)的內(nèi)容來(lái)進(jìn)行講述。
在IAR中,是通過(guò)工程配置堆棧大小,如下圖所示。
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。
堆(Heap)的默認(rèn)設(shè)置0x200(512)字節(jié)。
Heap_Size EQU 0x200
大部分人應(yīng)該很少使用malloc來(lái)分配堆空間。雖然堆上的數(shù)據(jù)只要程序員不釋放空間就可以一直訪問(wèn),但是,如果忘記了釋放堆內(nèi)存,那么將會(huì)造成內(nèi)存泄漏,甚至致命的潛在錯(cuò)誤。
經(jīng)常在線調(diào)試的人,可能會(huì)分析一些底層的內(nèi)容。這里結(jié)合MDK-ARM來(lái)分析一下RAM占用大小的問(wèn)題。在MDK編譯之后,會(huì)有一段RAM大小信息:
這里4+6=1640,轉(zhuǎn)換成16進(jìn)制就是0x668,在進(jìn)行在調(diào)試時(shí),會(huì)出現(xiàn):
這個(gè)MSP就是主堆棧指針,一般我們復(fù)位之后指向的位置,復(fù)位指向的其實(shí)是棧頂:
而MSP指向地址0x20000668是0x20000000偏移0x668而得來(lái)。具體哪些地方占用了RAM,可以參看map文件中【Image Symbol Table】處的內(nèi)容:
看完了這篇文章,相信你對(duì)“STM32單片機(jī)中堆棧的的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。