历史上的今天
返回首页

历史上的今天

今天是: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


按照上面的我标红色的部分的解释,这样的话RO-data、RW-data和code的大小加起来就是最终的烧入程序的大小,但是好像事情不是这么简单的。看截图:


3X{_`31Z7KL2Z6QPZDGOQRE

 

从我截图的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


上面是运行的过程,然后我们可以看生成的bin文件大小。


Z@S43Q{2`FMIP8V6%%{$JCH


从上面的图上看出,生成的bin文件和我们之前计算的一样了。其实如果是有特殊的需要的话,可以在keil里面设置调用fromelf就可以了。具体的自己百度。


推荐阅读

史海拾趣

Design Gateway公司的发展小趣事

1985年,泰德·维特(Ted Waitt)和Mike Hammond两位年轻人决定辍学创业。他们利用维特祖母的15,000美元存款作为担保,从银行获得了10,000美元贷款,租用了一台计算机,并准备了一份三页的经营计划。在维特父亲位于爱荷华州苏城的牧场里,他们创办了TIPC Network公司(Gateway的前身)。公司起步时,主要向得克萨斯电脑器械公司销售零配件,并开展计算机邮购业务。得益于直销商业模式,Gateway在短短四个月内就实现了10万美元的销售额。

Analytic Instruments Corp公司的发展小趣事

为了确保产品质量的稳定性和可靠性,Analytic Instruments Corp不断完善质量管理体系。公司引进了先进的生产设备和检测仪器,建立了严格的质量控制流程。同时,公司还加强了员工的培训和管理,提高了员工的质量意识和操作技能。这些举措使得公司的产品质量得到了客户的高度认可,进一步巩固了市场地位。

Coiltronics公司的发展小趣事

随着市场的不断扩大,Coiltronics公司意识到单凭自身的力量难以满足日益增长的市场需求。于是,公司开始积极寻求与其他企业的战略合作。通过与知名电子设备制造商建立合作关系,Coiltronics成功将其线圈技术应用于更广泛的领域,进一步提升了市场份额。同时,这种合作也带来了双方在技术研发、市场推广等方面的深入交流,为公司的长远发展奠定了坚实基础。

AMRI Enterprise Co Ltd公司的发展小趣事

AMRI Enterprise Co Ltd在电子行业中崭露头角,源于其一次重大的技术突破。公司研发团队经过数年的努力,成功开发出了一款具有高效能、低功耗特点的芯片,引起了市场的广泛关注。这一技术突破不仅提升了AMRI的产品竞争力,还为公司赢得了众多合作伙伴的青睐。随着产品线的不断扩展和市场份额的逐步增加,AMRI逐渐在电子行业中站稳了脚跟。

Aerovox Corporation公司的发展小趣事

AMRI Enterprise Co Ltd注重与高校和研究机构的产学研合作,通过引进先进技术和人才,推动公司的技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展科研项目和技术攻关。这些合作不仅为AMRI带来了前沿的技术成果,还提升了公司的研发能力和创新能力。在产学研合作的推动下,AMRI不断推出具有创新性和竞争力的新产品,为公司的持续发展提供了强有力的支撑。

Hitron公司的发展小趣事

面对国内市场的饱和竞争,AMRI Enterprise Co Ltd积极实施国际化战略,拓展海外市场。公司通过参加国际电子展会、建立海外销售渠道等方式,不断提升品牌知名度和产品影响力。同时,AMRI还针对不同国家和地区的市场需求,调整产品策略,提供定制化的解决方案。这一战略的实施,使得AMRI的产品成功打入多个国际市场,实现了业务的快速增长。

问答坊 | AI 解惑

stc资料

本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 常用的几款stc  …

查看全部问答>

在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 打勾, 但编译出错 ...…

查看全部问答>

仿真时工作正常,程序固化后却不能运行?

我用2051做了个程序,在仿真器上能跑,烧到mcu上却不行了.请高手指教.谢谢…

查看全部问答>

在Pocket PC 设备上用C#如何获取手机的信号和手机的电量????

平台:VS2005 + ComponentOne for Mobile +MSDN2005+Mobile 5.0 SDK 我是个新手,最近正在做一个手机项目 请问如何用C#获取手机的信号和手机的电量? 用到哪些方法和属性可以办到呀?最好举个例子!!!!!!!!    谢谢了!!!等着急用 ...…

查看全部问答>

谁熟悉tcpmp?请问怎样通过改写代码让其默认为纵向窗口播放?

谁熟悉tcpmp?请问怎样通过改写代码让其默认为纵向窗口播放? …

查看全部问答>

单片机不能往里写程序了。

刚买的试验板外带两个STC89C51RC,往里写了好几个光盘带的实例,都可以。 但我写了一个,烧进去后,单片机里面面所有的引脚都和晶振一样来回变电压,二极管一块乱闪,数码管也是,继电器也不停的卡卡响。 程序如下: ORG 00H MOV A,#00 E ...…

查看全部问答>

触摸屏校准问题

我现在遇到一个问题,现在的触摸屏校准时,不管单点有没有校准好,只要单击十字光标就指向下一个。五个点校完后,每个点都准就能较好,只要有一个点不准的话就重新循环校准。有时循环好几次都没能校准。 而有的触摸屏校准时,是每个点单独校准, ...…

查看全部问答>

请问在EVC4.0下syntax error : identifier 'LPDOCINFO'这个错误怎么解决

各位高手们,我在三星的Arm9-2410EP的台子上,定制了一个操作系统,并且可以正常运行并下载。导出了一个对应的SDK。我在电脑上安装了这个sdk,并且删除了以前的standard sdk。但是我运行evc后,随便建一个mfc的程序,一编译,都会出现error C2061:s ...…

查看全部问答>

这么简单的for(),怎么就死循环?

我在用STVD时,写了个效大的程序,可有个子程序跳不出来,我单步看发现是下 图中的第一个for总是跳不出,主要是在 i = 5 时,在汇编0x9648处把 i 清零,这倒底是不是COSMIC编绎器的问题? 我选是的stm8s105的单片机,已把所有的优化取消了, ...…

查看全部问答>

STM8L的EEPROM写之前需要擦除么?

                                 STM8L 的EEPROM写之前需要擦除么?…

查看全部问答>