浅析keil下RV MDK如何直接编译生成bin文件

来源:互联网 发布:it教育网站 编辑:程序博客网 时间:2024/04/27 17:17
浅析keil下RV MDK如何直接编译生成bin文件

网上好多人都想用hex转成bin,这样做不好,
一方面因为,Hex2bin程序对hex大小有限制(我的200k的hex就不能转换)
另一方面既然做的是arm那就应该使用纯正的arm格式, hex转bin总有些不伦不类,
至少我一直都认为bin和elf才是arm的正统文件,
只需做如下简单配置即可将axf这个elf文件直接转换为bin文件,
选择"Options for Target" ==> "User" ==> "Run User Programs After Build/Rebuild"将
选中Run#1和Run#2,分别输入:
Run#1输入 D:\keil\ARM\BIN31\fromelf.exe --bin -o net_gliethttp.bin objects\net_gliethttp.axf
Run#2输入 D:\keil\ARM\BIN31\fromelf.exe -z objects\net_gliethttp.axf
Project==>Clean Target
但不知道为什么,将.o全部清空之后,执行多次Rebuild All,每次结果都不一样,生成的hex也都不一样,
第一次编译生成的.bin文件比较大,以后再编译数据大小就正常了,奇怪![luther.gliethttp]
然后Rebuild All
第1次编译bin结果为Code=50916,RW=220所以最后bin文件大小50916+220=51136
第2次编译bin结果为Code=36076,RW=220所以最后bin文件大小36076+220=36296
第3次编译bin结果为Code=35860,RW=220所以最后bin文件大小35860+220=36080
第4次编译bin结果为Code=35896,RW=220所以最后bin文件大小35896+220=36116
第4次编译bin结果为Code=35888,RW=220所以最后bin文件大小35888+220=36108
第5次编译bin结果为Code=35896,RW=220所以最后bin文件大小35896+220=36116
第6次编译bin结果为Code=35888,RW=220所以最后bin文件大小35888+220=36108
第7次编译bin结果为Code=35896,RW=220所以最后bin文件大小35896+220=36116
第8次编译bin结果为Code=35888,RW=220所以最后bin文件大小35888+220=36108
所以从这里看到keil编译出来的大小每次都不一样,挺怪的,但是我们也可以看到规律,
前3次执行Rebuild All出来的结果不可用,从第4次开始出现交替结果[luther.gliethttp]

优化选项,进一步深入缩减bin代码空间:
Options for Target
1. Output==> Create Executable将
   x Debug Information 去掉
   x Create Hex file 去掉--对于arm的bin文件hex一点用也没有
   x Browse Information去掉
2. C/C++ ==> Language/Code Generation ==> Optimization选择Level 3(-O3)

附录:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0382ac/BABBDAAH.html
fromelf 命令行语法如下:
fromelf [build-options] [debug-options] [diagnostic-options] [help-options] [image-content-options] [license-option] [output-options] [privacy-options] [project-template-options] input_file

build-options
    使用下列选项控制生成属性的输出格式:
        *--decode_build_attributes
        *--dump_build_attributes
        *--extract_build_attributes
debug-options
    使用下列选项控制输出文件中的调试信息:
        *--[no_]debug
        *--debugonly
diagnostic-options
    使用下列选项控制输出文件中的诊断信息:
        *--diag_style={arm|ide|gnu}
        *--diag_suppress=tag[,tag,...]
        *--compare=option[,option,...]
        *--continue_on_error
        * --ignore_section=option[,option,...]
        * --ignore_symbol=option[,option,...]
        * --relax_section=option[,option,...]
        * --relax_symbol=option[,option,...]
        * --show_cmdline
help-options
    使用下列选项显示编译器的主命令行选项和版本号:
        *--help
        *--vsn
image-content-options
    使用以下选项可控制影响映像内容的其他因素:
        *--base [[object_file::]load_region_ID=]num
        *--cad
        *--cadcombined
        *--cpu=list
        *--cpu=name
        *--device=list
        * --device=name
        *--disassemble
        *--emit=option[,option,...]
        *--expandarrays
        *--fieldoffsets
        *--fpu=list
        *--fpu=name
        *--globalize=option[,option,...]
        *--hide=option[,option,...]
        *--hide_and_localize=option[,option,...]
        *--info=topic[,topic,...]
        *--in_place
        *--interleave=option
        *--[no_]linkview
        *--localize=option[,option,...]
        *--qualify
        *--rename=option[,option,...]
        *--select=select_options
        *--show=option[,option,...]
        *--show_and_globalize=option[,option,...]
        *--source_directory=path
        *--strip=option[,option,...]
        *--[no_]symbolversions
license-option
    要进一步尝试获取浮动许可证,请使用--licretry。
output-options
    使用下列选项控制输出格式:
        *--bin
        *--bincombined
        *--bincombined_base=address
        *--bincombined_padding=size,num
        *--elf
        *--i32
        *--i32combined
        *--m32
        *--m32combined
        *--output=destination
        *--text
        *--widthxbanks
        *--vhx
privacy-options
    使用下列选项保护传递到第三方的映像和对象中的 IP:
        *--privacy
        *--strip=option[,option,...]
project-template-options
    使用以下选项可控制项目模板的使用:
        *--[no_]project=filename
        *--reinitialize_workdir
        *--workdir=directory
input_file
    指定要处理的 ELF 文件,具体说明见input_file。
0 0