STM32F103RCT6項目RAM&ROM占用分析


STM32F103RCT6項目RAM&ROM占用分析

查閱DataSheet可知STM32F103RCT6屬於大容量產品,內含256KB的Flash,48KB的SRAM

image-20210217145353613

之前關於RAM&ROM的空間利用根本沒有考慮,但在移植FreeRTOS和jasson庫之后,在任務中調用Json_loads()時,包括用malloc申請空間時偶爾會出現Hardware fault。如此看來,合理的空間分配非常有必要!

#ROM

image-20210217151521790

手冊中的大容量產品以512KB的內部Flash為例(256KB同理),它主要分為三個部分:主存儲器、信息塊和一些相關寄存器

我們說的Flash大小就是指主存儲器的大小,2KB為一頁;

信息塊中存儲的內容是用於串口IAP程序下載方式的BootLoader,本項目用不到所以暫時不研究;


下載進去的代碼就存儲在256KB的主存儲塊中,具體代碼占用多少字節可以在keil編譯完成之后在Output窗口中查看:

image-20210218104920457

以這張圖為例,ROM占用的空間大概=Code + RO-data + RW-data,不超過32KB

相較於F103RCT6 256KB的ROM,空間還是很充裕的


#RAM

相比於ROM充裕的空間,RAM的48KB在移植FreeRTOS后就比較緊湊了

Build Output窗口有RW-data和ZI-data兩個Size

image-20210218104920457

RW-data是初始化為非0的數據占用空間,程序靜止時這些數據被存放在ROM,程序運行時被加載到RAM

ZI-data是初始化為0的數據占用空間,靜止時不占用空間,程序運行時被加載到RAM

本項目中RW-data+ZI-data共占用小於32KB的RAM

具體分配到以下部分:

1 內存管理

STM32沒有MMU,我們只能自己實現一個簡易的內存管理來動態申請空間(不然只定義數組這得浪費多大的空間),其實也就是定義一個指針來使用malloc()和free()申請和釋放連續的空間

根據正點原子例程中的定義,內存參數設定為:

//內存參數設定.
#define MEM_BLOCK_SIZE		        32  	         	    //內存塊大小為32B,內存分配時的最小單元
#define MEM_MAX_SIZE			10*1024  	            //最大管理內存10KB
#define MEM_ALLOC_TABLE_SIZE	MEM_MAX_SIZE/MEM_BLOCK_SIZE 	    //內存表大小

內存管理部分占用的RAM總共大小=MEM_MAX_SIZE+MEM_ALLOC_TABLE_SIZE*2(MEM_ALLOC_TABLE_SIZE*2是因為內存管理狀態表是uint_16類型的)

此例程中共分配10KB+640B,這是內存管理部分占用的RAM

2 FreeRTOS

FreeRTOSConfig.h文件中的configTOTAL_HEAP_SIZE定義了FreeRTOS分配的最大堆

configTOTAL_HEAP_SIZE宏定義的單位是Byte,但任務創建時的單位是size_t(4B)

#define configTOTAL_HEAP_SIZE                  ((size_t)8*1024)  

共計8KB

3 堆棧空間

啟動文件中配置了局部變量、遞歸調用等使用的棧空間,以及malloc動態內存申請使用的堆空間

實測jasson庫中的json_loads()的調用會占用較大的堆空間,我們自己進行動態申請時最好使用實現的內存管理中的內存分配函數mymalloc()

Stack_Size     EQU     0x400
Heap_Size      EQU     0x1000

共計5KB

4 初值0或非0的可讀寫數據

在map文件中可以看到每個源文件中這部分占用的RAM大小

image-20210218105503822


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM