日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]STM32堆??臻g不足問題 先說結(jié)論,以STM32F103RCT6為例,初始的棧空間是1KB,堆空間是512Byte。如果動態(tài)內(nèi)存分配需求過多時,需要手動調(diào)節(jié)堆空間。在啟動文件startup_stm32f103xe.s的開頭就可以設(shè)置堆??臻g大小。

STM32堆棧空間不足問題

先說結(jié)論,以STM32F103RCT6為例,初始的??臻g是1KB,堆空間是512Byte。如果動態(tài)內(nèi)存分配需求過多時,需要手動調(diào)節(jié)堆空間。在啟動文件startup_stm32f103xe.s的開頭就可以設(shè)置堆??臻g大小。同樣,在STM32CubeMX中也可對堆棧大小進行修改,在Project -> Settings選項中可以對Minimum Heap Size大小進行更改。擴大之后即可解決堆??臻g不足的問題。

遇到的問題

今天在STM32F103RCT6上,使用malloc()為鏈表分配內(nèi)存空間時,忽然遇到一次分配內(nèi)存過多而死機的問題。查閱官方文檔發(fā)現(xiàn)此型號的單片機FLASH 256KB,RAM 48KB。我鏈表的結(jié)構(gòu)體定義如下:

typedefstructLNode{uint8_tdata;structLNode*next;}LNode,*LinkList;1234

uint8_t類型在單片機中定義為unsigned char即1個字節(jié),32位系統(tǒng)一個指針變量為4字節(jié)。由于“內(nèi)存對齊”機制的存在,所以實際上一個節(jié)點分配的內(nèi)存為8字節(jié)。并且通過輸出語句printf("%d",sizeof(*Head));打印到串口助手顯示的也是8,證明的分析的正確性。

經(jīng)過測試發(fā)現(xiàn),我最多能創(chuàng)建32個節(jié)點,因此我只使用了32*8=256 byte的內(nèi)存空間。與官方文檔的48KB的內(nèi)存空間相差太多。

解決方法

查閱網(wǎng)上的博客發(fā)現(xiàn),堆棧大小可以在stm32的啟動文件startup_stm32f103xe.s里面設(shè)置,開頭就有:

Stack_SizeEQU0x400Heap_SizeEQU0x20012

0x00000400 等于1024字節(jié)所以等于1K

0x00000200 等于512字節(jié)所以等于512 Byte

參考博客:http://blog.csdn.net/xlhcgd/article/details/45769267

由于malloc()分配的動態(tài)內(nèi)存在堆區(qū)域,因此調(diào)大堆空間Heap_Size為0xC00,即3072字節(jié)大小。重新測試,發(fā)現(xiàn)可以接收到191個節(jié)點,這次使用了191*8=1528 byte大小的內(nèi)存空間。由此判斷,用戶可以自由使用的堆空間,大約為堆總空間的一半。超過時系統(tǒng)就會死機。

注:在STM32CubeMX中也可對堆棧大小進行修改,在Project -> Settings選項中可以對Minimum Heap Size大小進行更改。


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉