嗯,楼上说的都对,我验证过了,最终生成的目标代码大小=Code+RO Data+RW Data。实验如下:
建立一个最简单的工程,如下图:
main.c源码如下:
unsigned char var[1024]={
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
"ffffffffffffffff"
};
int _main(void)
{
unsigned char i;
while(1)
{
i = var[0];
i++;
}
}
工程中只有1个main.c文件,该文件也很简单,就1个全局变量unsigned char var[1024],和一个_main函数。这里用_main而不用main是因为main函数会让链接器自动添加C库函数启动代码,而C库函数启动代码又会对全局数据进行压缩处理,这样就会是我们最终得到的BIN文件缩水,所以我这里使用_main函数就不会自动链接C库函数启动代码了。对工程的设置如下:
分散加载文件使用自己编写的sct文件:
别忘了设置程序入口点,这里设置_mian为程序入口点,防止编译产生警告。
bin文件格式转换设置:
工程设置完毕后,编译、链接,最终结果如下图:
可以看到Code代码段占用16字节,只读数据段RO Data为0字节,读写数据段RW Data为1024字节。这是我们找到生成的test.bin文件查看其大小刚好为1040字节=Code(16) + RO Data(0) + RW Data(1024),如下图:
本来我以为数组中的字符串“ffffffffffffffff”.....都是常量,照理说应该将它们划分到RO Data段的,可是MDK刚好跟我想的相反,把他们的大小规划到RW Data段了,而RO Data段则不包括它们的大小。
如果将原来的全局变量改成const类型,那么很容易想到,RO Data就变为1024字节,而RW Data就变为0字节,如下图:
所以最终得出结论,最终占用FLASH空间大小的因素是由Code、RO Data、RW Data这三个空间决定的,一般情况下,是小于等于Code+RO Data+RW Data,因为C库函数启动代码会对数据进行压缩处理。