4

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

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

4

1 回答 1

2

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

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

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

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

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

另一种方法是根据Linux 的固件 Makefile使用Gnu Assembler 的 .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
于 2013-06-05T15:25:36.097 回答