历史上的今天
今天是:2024年12月29日(星期日)
2018年12月29日 | stm32后生成编译文件大小探索
2018-12-29 来源:eefocus
一般在stm32工程使用keil编译之后,keil的build output栏目下面会出现如图所示的输出信息,其中会显示code 大小 RO-data、RW-data 、ZI-data的大小。一般别人不怎么会在意这个的大小。
出于好奇我百度了下网上关于这些段的介绍,援引自http://mcuos.com/thread-2843-1-1.html,上面的介绍是这样说的:
ARM程序的组成
此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。
一个ARM程序包含3部分:RO,RW和ZI。RO是程序中的指令和常量;RW是程序中的已初始化变量;ZI是程序中的未初始化的变量.
由以上3点说明可以理解为:RO就是readonly,RW就是read/write,ZI就是zero
ARM映像文件的组成
所谓ARM映像文件就是指烧录到ROM中的bin文件,也称为image文件。以下用Image文件来称呼它。
Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
Q:为什么Image中必须包含RO和RW?
A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。
ARM程序的执行过程
从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。
实际上,RO中的指令至少应该有这样的功能:
1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
![VQJGFXYY$H7PG)T$Z]Q0901 VQJGFXYY$H7PG)T$Z]Q0901](https://8.eewimg.cn/news/uploadfile/2018/1229/20181229105404198.png?imageView2/2/w/550)
按照上面的我标红色的部分的解释,这样的话RO-data、RW-data和code的大小加起来就是最终的烧入程序的大小,但是好像事情不是这么简单的。看截图:

从我截图的hex程序来看程序的大小是1.5K和我们编译出来的RO-data+RW-data+code的大小是304+252=556字节,557字节和1.5K相差了很多,这又是怎么回事呢?
这时候我想起了hex和bin这两种文件的格式,我在想是不是因为格式的原因在到鬼呢?
百度了下,http://wenku.baidu.com/link?url=jnO4kGRmKoGA8SGl6wN9nZboEAPUqnZGs0_XYk743E47wCTF5a7CRjbpRaJaeG92Voe92dqWOxYKsRRRP3PC4wYMZA65udxGU25EBcR3vmW
这是百度文库里面一篇关于单片机编译生成的各种文件的格式的介绍,从介绍中我们很明显的hex文件的大小并不等于最终烧入到单片机的程序大小,因为hex里面有很多的ASSII码的信息,最终的程序大小是可以从bin文件中看出来的。怎么样子把hex文件转化为bin文件呢?
在keil的安装目录下面有一个小工具:C:\Keil_v5\ARM\ARMCC\bin目录下面有一个fromelf.exe的小工具,是可以将axf文件转换成bin文件的一个小工具。我在命令行下面进行了这个操作。
![FJ5F$(F6OX8`}]E)E(XT`MQ FJ5F$(F6OX8`}]E)E(XT`MQ](https://8.eewimg.cn/news/uploadfile/2018/1229/20181229105404793.png?imageView2/2/w/550)
上面是运行的过程,然后我们可以看生成的bin文件大小。

从上面的图上看出,生成的bin文件和我们之前计算的一样了。其实如果是有特殊的需要的话,可以在keil里面设置调用fromelf就可以了。具体的自己百度。
上一篇:STM32 禁用或开启总中断
下一篇:stm32内存空间分配学习
史海拾趣
|
在VS2005+PB60下编译WinCE60的BSP,怎么把Cellcore.dll加进来 在VS2005+PB60下编译WinCE60的BSP,怎么把Cellcore.dll加进来? 在Mini2440的BSP工程下的Catalog items view窗口下给 Mini2440\\Core OS\\CEBASE\\Communication Services and Networking\\Cellular\\CELLCORE\\All Modules 打勾, 但编译出错 ...… 查看全部问答> |
|
在Pocket PC 设备上用C#如何获取手机的信号和手机的电量???? 平台:VS2005 + ComponentOne for Mobile +MSDN2005+Mobile 5.0 SDK 我是个新手,最近正在做一个手机项目 请问如何用C#获取手机的信号和手机的电量? 用到哪些方法和属性可以办到呀?最好举个例子!!!!!!!! 谢谢了!!!等着急用 ...… 查看全部问答> |
|
刚买的试验板外带两个STC89C51RC,往里写了好几个光盘带的实例,都可以。 但我写了一个,烧进去后,单片机里面面所有的引脚都和晶振一样来回变电压,二极管一块乱闪,数码管也是,继电器也不停的卡卡响。 程序如下: ORG 00H MOV A,#00 E ...… 查看全部问答> |
|
请问在EVC4.0下syntax error : identifier 'LPDOCINFO'这个错误怎么解决 各位高手们,我在三星的Arm9-2410EP的台子上,定制了一个操作系统,并且可以正常运行并下载。导出了一个对应的SDK。我在电脑上安装了这个sdk,并且删除了以前的standard sdk。但是我运行evc后,随便建一个mfc的程序,一编译,都会出现error C2061:s ...… 查看全部问答> |
|
我在用STVD时,写了个效大的程序,可有个子程序跳不出来,我单步看发现是下 图中的第一个for总是跳不出,主要是在 i = 5 时,在汇编0x9648处把 i 清零,这倒底是不是COSMIC编绎器的问题? 我选是的stm8s105的单片机,已把所有的优化取消了, ...… 查看全部问答> |




