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

sup*_*cat 5 build-process arm 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数据的大小被固定,以允许在程序控制下加载它,但加载它的硬件通道尚不存在]。

art*_*ise 2

您可以从二进制文件创建ELFobjcopy文件,如下所示:

objcopy -I binary -B arm -O elf32-littlearm --rename-section \
     .data=.remote.data remote.bin remote.elf
Run Code Online (Sandbox Code Playgroud)

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

.remote { 
     REMOTE_CPU_DATA = . ;
     *(.remote.data); 
}
Run Code Online (Sandbox Code Playgroud)

把它放在你喜欢的地方。数据可以从“C”访问,extern char REMOTE_CPU_DATA[];或者以您希望的方式键入数据。您可以使用等来调整二进制文件的字节序。dd

另一种方法是根据Linux 固件 Makefile使用Gnu 汇编器 指令。.incbin

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

编辑: 这也可以通过使用一些 *nix 工具的 shell 脚本来完成,

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