搜索
bottom↓
回复: 8

编译的十六进制文件如果大于FLASH,那么它是如何下载进去的呢?

[复制链接]

出0入0汤圆

发表于 2011-7-21 08:51:38 | 显示全部楼层 |阅读模式
我跑ucos在STM32F103ZET6上面,ZET6是512K FLASH,然后编译出来的HEX文件是600多K,我就想不通它怎么下载进去的,
用的工具KEIL MDK,是被压缩再下载进去的吗?还是如何实现的呢?

出0入0汤圆

发表于 2011-7-21 08:54:09 | 显示全部楼层
到底是二进制文件,还是Hex文件?
Hex文件是文本文件,里面包含地址和指令,所以比目标二进制文件要大。
二进制文件才是纯的指令,通常就是目标代码的大小。

出0入0汤圆

发表于 2011-7-21 08:57:13 | 显示全部楼层
hex转为二进制就会小很多了。

出0入0汤圆

 楼主| 发表于 2011-7-21 12:23:40 | 显示全部楼层
由于用的是KEIL MDK,这个编译器没有输出BIN文件的,只有输出HEX文件的,就是下载程序的时候,将HEX文件转换为BIN文件下载下去的吗?比FLASH容量大,不可能是下载HEX所有的数据进去吧

出0入0汤圆

发表于 2011-7-21 12:29:04 | 显示全部楼层
回复【3楼】mcu520
-----------------------------------------------------------------------

HEX文件是用来给人看的,里面的数据都是ASCII码,比如0x0000,在二进制里面只占16位,但是HEX文件中要用 0x30 0x30 0x30 0x30 四个字节来表示,占用32位

另外,HEX文件中还包含地址、校验等信息,这些都不是最终的可执行程序需要的

也就是,你看到的HEX文件的大小,要比真正写入芯片的数据多得多

真正写入芯片的数据,是二进制文件, *.bin

KEILL也是可以生成BIN文件的,自己百度一下吧

出0入0汤圆

发表于 2011-7-21 12:31:14 | 显示全部楼层
hex是包含了很多信息的,有地址、数据、长度、CRC等信息。转成bin以后就全部是代码数据,那样会小很多。当然也有例外,假如你在0xFFFF0000写一个数据,hex的话只要一行就能解决。但是bin就会把0xFFFF0000前面地址所有数据都填满,然后再填写0xFFFF0000。这样就会发生bin比hex大的情况。

不知道我说的理解不。

出0入0汤圆

发表于 2011-7-21 12:58:19 | 显示全部楼层
你用keil2编译一个51的程序试试看,看Code等于多少,实际生成HEX文件是多大。

出0入0汤圆

 楼主| 发表于 2011-7-21 15:52:39 | 显示全部楼层
keil uvision3怎样生成bin文件!
怎样用Realview MDK生成bin文件?
      使用RVCT的fromelf.exe工具进行转换。也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*.axf格式的文件转换成*.bin格式的文件。
假设工程文件的名字为Axf_To_Bin, 下面将具体说明这个操作步骤:

1.       打开Axf_To_Bin文件中的Axf_To_Bin.uv2工程文件;

2.       打开Options for Target ‘Axf_To_Bin’对话框,选择User标签页;

3.       构选Run User Programs After Build/Rebuild框中的Run #1多选框,在后边的文本框中输入C:\Keil\ARM\BIN31\fromelf.exe --bin -o ./output/Axf_To_Bin.bin ./output/Axf_To_Bin.axf命令行;

4.       重新编译文件,在./output/文件夹下生成了Axf_To_Bin.bin文件。

在上面的步骤中,有几点值得注意的是:

1.        C:\Keil\ARM\BIN31\表示RV MDK的安装目录;

2.        fromelf.exe命令的具体语法格式如下:

命令的格式为:fromelf [options] input_file

命令选项如下:

       --help               显示帮助信息

       --vsn               显示版本信息

       --output file     输出文件(默认的输出为文本格式)

       --nodebug           在生成的映象中不包含调试信息

       --nolinkview          在生成的映象中不包含段的信息

二进制输出格式:

       --bin                生成Plain Binary格式的文件

       --m32              生成Motorola 32位十六进制格式的文件

       --i32                生成Intel 32位十六进制格式的文件

       --vhx               面向字节的位十六进制格式的文件t

       --base addr                  设置m32,i32格式文件的基地址

       --text                显示文本信息

                文本信息的标志

                -v          打印详细信息

                -a          打印数据地址(针对带调试信息的映象)

                -d          打印数据段的内容

                -e          打印表达式表print exception tables

                -f          打印消除虚函数的信息

                -g         打印调试表print debug tables

                -r          打印重定位信息

                -s          打印字符表

                -t          打印字符串表

                -y          打印动态段的内容

                -z          打印代码和数据大小的信息

出0入0汤圆

发表于 2011-7-21 16:54:36 | 显示全部楼层
正在写入芯片的是*.BIN文件,会比*.hex小一半多
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 12:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表