stm32后生成编译文件大小探索

转自:http://www.cnblogs.com/51mcu/p/3940376.html
一般在stm32工程使用keil编译之后,keil的build output栏目下面会出现如图所示的输出信息,其中会显示code 大小 RO-data、RW-data 、ZI-data的大小。一般别人不怎么会在意这个的大小。
在这里插入图片描述
code : 代码
RO-data :指的是程序中的指令和常量
RW-data :程序中已经初始化的变量
ZI-data :程序中未初始化的便利那个
烧录文件的大小=code + RO-data + RW-data=304+252+ 0 =556个字节
烧录文件大小指的是bin文件而非hex文件,bin的才是下载的二进制文件。
芯片需要的RAM大小=RW-data+ZI-data=0+1632=1632个字节

ARM映像文件的组成:
所谓ARM映像文件就是指烧录到ROM中的bin文件,也称为image文件。以下用Image文件来称呼它。
Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

ARM程序的执行过程
实际上,RO中的指令至少应该有这样的功能:
1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。

假设Program Size: Code=10668 RO-data=380 RW-data=192 ZI-data=20168
那么需要的flash大小为 =10668 +380 +192 = 11240 字节=10.98K字节
需要的RAM大小=192+20168= 20360 字节 =19.89K字节
原程序编译结果:
在这里插入图片描述

(1)代码中添加 tab[10000] ZI-data 增加 10000

u8 tab[10000]={0};
void vApplicationTickHook(void)
{
tab[0]=0;//调用数组,否则会被优化掉!
if(SecsDelayFlag!=0)SecsDelayFlag--;
if(SecsOverTimeFlag!=0)SecsOverTimeFlag--;
}

在这里插入图片描述
(2)代码中添加 tab[10000]并初始化 RW-data 增加 10000

u8 tab[10000]={1,2,3};
void vApplicationTickHook(void)
{
	tab[0]=0;;//调用数组,否则会被优化掉!
if(SecsDelayFlag!=0)SecsDelayFlag--;
if(SecsOverTimeFlag!=0)SecsOverTimeFlag--;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ZenNaiHeQiao/article/details/83343504