浅析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)
附录:
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。