STM32F103RCT6項目RAM&ROM占用分析
查閱DataSheet可知STM32F103RCT6屬於大容量產品,內含256KB的Flash,48KB的SRAM
之前關於RAM&ROM的空間利用根本沒有考慮,但在移植FreeRTOS和jasson庫之后,在任務中調用Json_loads()時,包括用malloc申請空間時偶爾會出現Hardware fault。如此看來,合理的空間分配非常有必要!
#ROM

手冊中的大容量產品以512KB的內部Flash為例(256KB同理),它主要分為三個部分:主存儲器、信息塊和一些相關寄存器
我們說的Flash大小就是指主存儲器的大小,2KB為一頁;
信息塊中存儲的內容是用於串口IAP程序下載方式的BootLoader,本項目用不到所以暫時不研究;
下載進去的代碼就存儲在256KB的主存儲塊中,具體代碼占用多少字節可以在keil編譯完成之后在Output窗口中查看:

以這張圖為例,ROM占用的空間大概=Code + RO-data + RW-data,不超過32KB
相較於F103RCT6 256KB的ROM,空間還是很充裕的
#RAM
相比於ROM充裕的空間,RAM的48KB在移植FreeRTOS后就比較緊湊了
Build Output窗口有RW-data和ZI-data兩個Size

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大小
