STM32程序内存使用分析

int a=0; //全局初始化区

char *p1; //全局未初始化区

main()

{

int b; //栈

char s[]=“abc”; //栈

char *p3= “1234567”; //在文字常量区Flash

static int c =0 ; //静态初始化区

p1= (char *)malloc(10); //堆区

strcpy(p1,“123456”); //"123456"放在常量区

}

0 down
1 up

Program Size 包含以下几个部分:
1) Code:代码段,存放程序的代码部分;
2) RO-data:只读数据段,存放程序中定义的常量;
3) RW-data:读写数据段,存放初始化为非 0 值的全局变量;
4) ZI-data: 0 数据段,存放未初始化的全局变量及初始化为 0 的变量;

1) RO Size 包含了 Code 及 RO-data,表示程序占用 Flash 空间的大小;
2) RW Size 包含了 RW-data 及 ZI-data,表示运行时占用的 RAM 的大小;
3) ROM Size 包含了 Code、 RO Data 以及 RW Data,表示烧写程序所占用的 Flash 空间的大小;

程序运行之前,需要有文件实体被烧录到 STM32 的 Flash 中,一般是 bin 或者 hex 文件,该被烧录
文件称为可执行映像文件。如图 3-3 中左图所示,是可执行映像文件烧录到 STM32 后的内存分布,它包
含 RO 段和 RW 段两个部分:其中 RO 段中保存了 Code、 RO-data 的数据, RW 段保存了 RW-data 的数
据,由于 ZI-data 都是 0,所以未包含在映像文件中。

STM32 在上电启动之后默认从 Flash 启动,启动之后会将 RW 段中的 RW-data(初始化的全局变量)
搬运到 RAM 中,但不会搬运 RO 段,即 CPU 的执行代码从 Flash 中读取,另外根据编译器给出的 ZI 地
址和大小分配出 ZI 段,并将这块 RAM 区域清零。

其中动态内存堆为未使用的 RAM 空间,应用程序申请和释放的内存块都来自该空间。

你可能感兴趣的:(嵌入式)