如何为多个组合二进制文件设置构建

时间:2013-06-05 15:13:38

标签: arm build-process keil

使用嵌入式系统时,有时需要为处理器加载几个独立编译和链接的二进制文件;在我目前的项目中,处理器应该具有自己的代码映像和代码映像,它应该传输到与之通信的远程设备。如果我使用十六进制或二进制文件对芯片进行编程,我可以使用批处理文件简单地连接单独构建和链接文件的内容(可能使用“FIND / V”来删除诸如英特尔文档结束记录之类的内容)。但是,使用Keil调试器对器件进行编程时,芯片不是从这样的文件加载而是从.AXF文件加载。

如果在测试主设备的代码(调试器附加到的代码)时,应该发送到远程设备的代码映像会发生多次更改,那么设置构建的最有用方法可能是什么处理?我倾向于编写一个实用程序来将远程处理器代码的二进制文件转换为包含const unsigned char REMOTE_CPU_DATA[] = {...}';的C文件,并配置链接器以在适当的地址找到该文件的const部分,或者ASM文件包含绝对数据指令,然后让该实用程序作为主代码的构建过程的一部分运行,但将二进制数据转换为文本格式以包含在项目中似乎很蹩脚。另外,最好找一个库存实用程序来进行这样的转换,或者在C#或VB.NET这样的东西中编写一个特殊用途的(我可以使用任何一种语言,但主要使用后者进行PC开发)?我希望ASM输出是特定于Keil的,而C输出将是开发系统不可知的,但是使用C而不是ASM需要在链接器规范中添加一行来设置远程CPU数据的绝对地址[地址]固定远程CPU数据以允许它在程序控制下加载,但它将加载它的硬件通道尚不存在]。

1 个答案:

答案 0 :(得分:2)

您可以使用objcopy这样的二进制文件创建 ELF 文件,

objcopy -I binary -B arm -O elf32-littlearm --rename-section \
     .data=.remote.data remote.bin remote.elf

然后您可以像这样更新链接器脚本,

.remote { 
     REMOTE_CPU_DATA = . ;
     *(.remote.data); 
}

将它放在任何你喜欢的地方。使用extern char REMOTE_CPU_DATA[];'C'访问数据,或者您希望输入数据。您可以使用dd二进制文件的结尾

另一种方法是根据.incbin使用 Gnu汇编程序的 Linux's firmware Makefile指令。

我不知道 Keil 工具是否可以处理objdumpgas输出的 ELF 格式。我认为类似的想法可能适用于 Keil 工具,如果它们具有相似的语义。

编辑:这也可以通过带有* nix工具的shell脚本完成,

printf 'char REMOTE_CPU_DATA[] = {' && \
 hexdump -v -e '16/1 "0x%x," "\n"' remote.bin && \
 printf '};' > remote.c