Keil 工程在编译完之后,会有相应的程序所占用的空间提示信息,如下所示:
1)Code:代码段,存放程序的代码部分;
2)RO-data:只读数据段,存放程序中定义的常量;
3)RW-data:读写数据段,存放初始化为非 0 值的全局变量;
4)ZI-data:0 数据段,存放未初始化的全局变量及初始化为 0 的变量;
下面对几个数值的关系进行说明
ROM size: 也就是下载到单片机FLASH中的数据为 Code +RO-data +RW-data 和的大小。
为什么不把ZI-data 也下载进去呢? 其实是没有必要的,这是浪费空间,只要程序一上电运
行就会把ZI-data 自动清0。
RAM size: 程序运行时所需要的大小空间为 RW-data+ ZI-data
.axf文件 -- axf文件是编译默认生成的文件,不仅包含二进制代码数据,而且还包含着调试信息,在MDK里进行debug调试用的就是这个文件。真正下载到片上Flash中的信息仅仅是可执行代码,所以当axf文件大于片上flash空间不要慌,计算一下Code +RO-data +RW-data 的和也就是bin文件大小,才能判断是否大于片上flash空间。通过keil下载到单片机的就是这个文件。
.hex文件 -- hex 文件是一种使用十六进制符号表示的代码记录, 记录了代码应该存储到FLASH 的哪个地址和二进制代码数据。flymcu通过串口下载就是下载内部的二进制数据【bin文件数据】这个文件【这个文件可以通过HexTobin工具转bin文件】。
.bin文件 -- bin文件就是最小的可以运行的文件了,其包含最直接的代码映像,coflash或Jflash下载的就是这个文件。
这三个文件中axf文件最大,hex文件次之,bin文件最小。
/*********************************************举个例子:**************************************************/
我使用的STM32F103ZET6,Flash大小512kb,ROM64kb
我的keil工程编译后的文件,fatfs.bin文件是我用hex2bin工具通过fatfs.hex文件转化的
我的keil编译信息:
Program Size: Code=13720 RO-data=176716 RW-data=132 ZI-data=23212
计算要下载到片上flash的数据大小:
(13720+176716+132)/1024 = 186.1015Kb < 512kb
RAM size: 程序运行时所需要的大小空间为:
(132+23212)/1024 = 22.796kb < 64kb
从fatfs.axf大小来看,虽然它超出了flash的大小512kb,但是实际下载进去的是186.1015kb【有效二进制代码数据】,所以它能够下载到我们的单片机中去。