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