STM32F103RCT6项目RAM&ROM占用分析
STM32F103RCT6項(xiàng)目RAM&ROM占用分析
查閱DataSheet可知STM32F103RCT6屬于大容量產(chǎn)品,內(nèi)含256KB的Flash,48KB的SRAM
之前關(guān)于RAM&ROM的空間利用根本沒(méi)有考慮,但在移植FreeRTOS和jasson庫(kù)之后,在任務(wù)中調(diào)用Json_loads()時(shí),包括用malloc申請(qǐng)空間時(shí)偶爾會(huì)出現(xiàn)Hardware fault。如此看來(lái),合理的空間分配非常有必要!
#ROM
手冊(cè)中的大容量產(chǎn)品以512KB的內(nèi)部Flash為例(256KB同理),它主要分為三個(gè)部分:主存儲(chǔ)器、信息塊和一些相關(guān)寄存器
我們說(shuō)的Flash大小就是指主存儲(chǔ)器的大小,2KB為一頁(yè);
信息塊中存儲(chǔ)的內(nèi)容是用于串口IAP程序下載方式的BootLoader,本項(xiàng)目用不到所以暫時(shí)不研究;
?
下載進(jìn)去的代碼就存儲(chǔ)在256KB的主存儲(chǔ)塊中,具體代碼占用多少字節(jié)可以在keil編譯完成之后在Output窗口中查看:
以這張圖為例,ROM占用的空間大概=Code + RO-data + RW-data,不超過(guò)32KB
相較于F103RCT6 256KB的ROM,空間還是很充裕的
#RAM
相比于ROM充裕的空間,RAM的48KB在移植FreeRTOS后就比較緊湊了
Build Output窗口有RW-data和ZI-data兩個(gè)Size
RW-data是初始化為非0的數(shù)據(jù)占用空間,程序靜止時(shí)這些數(shù)據(jù)被存放在ROM,程序運(yùn)行時(shí)被加載到RAM
ZI-data是初始化為0的數(shù)據(jù)占用空間,靜止時(shí)不占用空間,程序運(yùn)行時(shí)被加載到RAM
本項(xiàng)目中RW-data+ZI-data共占用小于32KB的RAM
具體分配到以下部分:
1 內(nèi)存管理
STM32沒(méi)有MMU,我們只能自己實(shí)現(xiàn)一個(gè)簡(jiǎn)易的內(nèi)存管理來(lái)動(dòng)態(tài)申請(qǐng)空間(不然只定義數(shù)組這得浪費(fèi)多大的空間),其實(shí)也就是定義一個(gè)指針來(lái)使用malloc()和free()申請(qǐng)和釋放連續(xù)的空間
根據(jù)正點(diǎn)原子例程中的定義,內(nèi)存參數(shù)設(shè)定為:
//內(nèi)存參數(shù)設(shè)定.
#define MEM_BLOCK_SIZE 32 //內(nèi)存塊大小為32B,內(nèi)存分配時(shí)的最小單元
#define MEM_MAX_SIZE 10*1024 //最大管理內(nèi)存10KB
#define MEM_ALLOC_TABLE_SIZE MEM_MAX_SIZE/MEM_BLOCK_SIZE //內(nèi)存表大小
內(nèi)存管理部分占用的RAM總共大小=MEM_MAX_SIZE+MEM_ALLOC_TABLE_SIZE*2(MEM_ALLOC_TABLE_SIZE*2是因?yàn)閮?nèi)存管理狀態(tài)表是uint_16類型的)
此例程中共分配10KB+640B,這是內(nèi)存管理部分占用的RAM
2 FreeRTOS
FreeRTOSConfig.h文件中的configTOTAL_HEAP_SIZE定義了FreeRTOS分配的最大堆
configTOTAL_HEAP_SIZE宏定義的單位是Byte,但任務(wù)創(chuàng)建時(shí)的單位是size_t(4B)
#define configTOTAL_HEAP_SIZE ((size_t)8*1024)
共計(jì)8KB
3 堆棧空間
啟動(dòng)文件中配置了局部變量、遞歸調(diào)用等使用的棧空間,以及malloc動(dòng)態(tài)內(nèi)存申請(qǐng)使用的堆空間
實(shí)測(cè)jasson庫(kù)中的json_loads()的調(diào)用會(huì)占用較大的堆空間,我們自己進(jìn)行動(dòng)態(tài)申請(qǐng)時(shí)最好使用實(shí)現(xiàn)的內(nèi)存管理中的內(nèi)存分配函數(shù)mymalloc()
Stack_Size EQU 0x400
Heap_Size EQU 0x1000
共計(jì)5KB
4 初值0或非0的可讀寫(xiě)數(shù)據(jù)
在map文件中可以看到每個(gè)源文件中這部分占用的RAM大小
總結(jié)
以上是生活随笔為你收集整理的STM32F103RCT6项目RAM&ROM占用分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NIFI从mysql导入Hbase
- 下一篇: Zookeeper已经设置了myid文件