keil4_MDK"编译报错"--- Error: User Command terminated, Exit-Code = 1

详细信息:

FromELF: creating hex file...
User command #1: D:\Keil\ARM\BIN40\fromelf.exe  --bin  ..\Obj\Bootloader.axf   -o  ..\Obj\Bootloader.bin
--- Error: User Command terminated, Exit-Code = 1

原因及解决办法:

在OPTIONS FOR TARGET ->User分页有个RUN#1,功能是编译完成后执行该指令操作,应该是该指令有问题,一般情况下该错误是RUN#1设置的执行的程序位置不对;比如你的keil是装在c盘的,自然fromelf.exe文件也在C盘,你要使用fromelf将编译后生成的afx文件再转成bin文件(理论hex文件再转成bin文件也可以,但实测会报错,错误信息为:

C:\Keil\ARM\BIN40\fromelf.exe  --bin  ..\Obj\Bootloader.hex   -o  ..\Obj\Bootloader.bin
FromELF: creating hex file...

User command #1: C:\Keil\ARM\BIN40\fromelf.exe  --bin  ..\Obj\Bootloader.hex   -o  ..\Obj\Bootloader.bin

"..\Obj\Bootloader.hex": Error: Q0454E: In ELF file: File is not an ELF file (wrong magic number)
Finished: 0 information, 0 warning and 1 error messages.

"..\Obj\Bootloader.axf" - 0 Error(s), 0 Warning(s).

),那么你的执行程序的位置改为“C:\Keil\ARM\BIN40\fromelf.exe”,再如果你的keil装在D盘,那么执行程序的路径为D:\Keil\ARM\BIN40\fromelf.exe ;否则会提示该错误,如果不需要把生成的hex文件转bin文件,将Run User Programs AfterBuild/Rebuild的Run #1前的勾去掉或选择fromelf.exe就可以了.


 其它说明:

补充:

一、在 Realview MDK 中如何生成*.bin 格式的文件

在 Realview MDK 的集成开发环境中,默认情况下可以生成*.axf 格式的调试文件和*.hex 格式的可 执行文件。虽然这两个格式的文件非常有利于 ULINK2 仿真器的下载和调试,但是 ADS 的用户更习惯 于使用*.bin 格式的文件,甚至有些嵌入式软件开发者已经拥有了*.bin 格式文件的调试或烧写工具。为 了充分地利用现有的工具,同时发挥 Realview MDK 集成开发环境的优势,将*.axf 格式文件或*.hex 格 式文件转换成*.bin 格式的文件是十分自然的想法。本文将详细的探讨这种转换方法。
在详细的介绍这种方法之前,先了解一下 ARM 公司的 RVCT 开发套件中的 fromelf.exe 转换工具是 十分必要的,因为在 Realview MDK 中生成*.bin 格式文件的工具正是它。

fromelf.exe 转换工具的语法格式如下:

fromelf.exe工具的使用

fromelf.exe 转换工具的语法格式如下:

fromelf [options] input_file

其中[options]包括的选项及详细描述见表一
keil4_MDK
在掌握了 fromelf 转换工具的语法格式以后,下面将介绍它在 Realview MDK 中的使用方法:(使用的是keil mdk4,如果为keil uv2则第三步中的BIN40应改为BIN31)
1. 新建一个工程,例如工程名为 Axf_To_Bin;
2. 打开 Options for Target ‘Axf_To_Bin ’对话框,选择 User 标签页;
3. 构选 Run User Programs After Build/Rebuild 框中的 Run #1 多选框,在后边的文本框中输入
C:\Keil\ARM\BIN40\fromelf.exe --bin -o ./output/Axf_To_Bin.bin ./output/Axf_To_Bin.axf 命令行;
4. 重新编译文件,在./output/文件夹下生成了 Axf_To_Bin.bin 文件。
经过上述 4 步的操作以后,将得到我们希望的 Axf_To_Bin.bin 格式的文件。
注意:第三步中是把***.axf文件转为***.bin,因此路径一定要正确(属于哪个层级和***.axf所在的文件夹名,比如输出 ***.axf在obj目录下,那么output应改为obj,具体怎么确定***.axf文件我就不做详细描述了


二、Hex、bin、axf、elf格式文件小结引用http://blog.csdn.net/grow_mature/article/details/8553542,只做了小修改

 

一、HEX

Hex文件,一般是指Intel标准的十六进制文件。Intelhex 文件常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般编程器均支持生成此种格式文件。如,KEIL下可通过配置相关选项来生成HEX目标文件。


HEX文件由记录(RECORD)组成。在HEX文件里面,每一行代表一个记录。

形如 
:BBAAAATTHHHH...HHHHCC 

BB:字节个数。 

AAAA:数据记录的开始地址,高位在前,低位在后。

TT: Type 

00数据记录,用来记录数据。

01记录结束,放在文件末尾,用来标识文件结束。

02用来标识扩展段地址的记录 

04扩展地址记录(表示32位地址的前缀)

HHHH:一个字(Word)的数据记录,高字节在前,低字节在后。TT之后共有 BB/2 个字的数据 
CC:
占据一个ByteCheckSum 

举例分析:

:020000040000FA
:10000400FF00A0E314209FE5001092E5011092E5A3
:00000001FF         

第1条记录长度为0x02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0000,校验和为FA。从这个记录的长度和数据,我们可以计算出基地址为0X0000。后面的数据记录都以此地址为基地址。
第2条记录长度为0x10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个字节,记录的校验和为A3。此时的基地址为0X0000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x0000 + 0x0004 = 0x0004. 其实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5。

第3条记录的长度为00,LOAD OFFSET为0000,TYPE= 01,校验和为FF。类型为01,说明这个是一个END OF FILE RECORD,标识文件的结尾。HEX结束符一般以:00000001FF结尾。

二、BIN

Bin文件是最纯粹的二进制机器代码, 或者说是"顺序格式"。按照assembly code顺序翻译成binary machine code,内部没有地址标记。Bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。

简单总结一下这2种文件格式的区别:

1、HEX文件包含地址信息而BIN文件只包含数据本身,烧写或下载HEX文件时,一般不需要用户指定地址,因为HEX文件内部已经包含了地址信息。烧写BIN文件时则需要用户指定烧录的地址信息。
2、HEX文件是用ASCII码来表示二进制的数值。例如8-BIT的二进制数值0x4E,用ASCII来表示就需要分别表示字符‘4’和字符‘E’,每个字符均需要一个字节,因此HEX文件至少需要2倍BIN文件的空间。

三、Axf

Axf文件由ARM编译器产生,是ARM芯片是使用的文件格式,是用作调试时用的,无论是用RVDS,还是MDK,都能够产生该文件。它包含bin代码外,还包括了调试信息,这些调试信息加在可执行的二进制数据之前。调试时这些调试信息不会下载到RAM中,真正下载到RAM中的信息仅仅是可执行代码。因此,如果ram的大小小于axf文件的大小,程序是完全有可能在ram中调试的,只要axf除去调试信息后文件大小小于ram的大小即可。

调试信息有以下功用:

1、 可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。

2、 我们还可以对程序中的函数调用情况进行跟踪(通过Watch & Call Stack Window查看)。

3、对变量进行跟踪(利用Watch & Call Stack Window)。

调试信息虽然有用,但程序功能实现后,在目标文件和库中减少调试信息却是非常有益的。减少调试信息可减少目标文件和库大小、加快链接速度、减小最终镜象代码。以下几种方法可用来减少每个源文件产生的调试信息:

1、避免在头文件中条件性使用#define,链接器不能移除共用的调试部分,除非这些部分是完全一样的。

2、更改C/C++源文件,使#included包含的所有头文件有相同顺序。

3、尽量使用数量较多的小头文件而不是较大的单一头文件,这有利于链接器获取更多的通用块。

4、程序中最好只包含必须用到的头文件。避免重复包含头文件,可使用编译器选项--remarks来产生警告信息;

5、使用编译命令行选项--no_debug_macros,从调试表中丢弃预处理宏定义。

四、ELF

ELFExecutableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,有三种主要类型:
(1)
适于连接的可重定位文件(relocatablefile),可与其它目标文件一起创建可执行文件和共享目标文件。

(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载到内存执行。

(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。 

ELF文件格式比较复杂。

小结:可由elf文件转化为hexbin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hexbin不能转化为elf文件,因为elf的信息量要大。Axf文件可以转化为bin文件,KEIL下可用以下命令fromelf -nodebug xx.axf -bin xx.bin即可。


相关知识引用引用http://blog.csdn.net/grow_mature/article/details/8553542
http://blog.csdn.net/norains/article/details/5899924

 

 

你可能感兴趣的:(STM32)