【问题标题】:How to set up build for multiple combined binaries如何为多个组合二进制文件设置构建
【发布时间】:2013-06-05 15:13:38
【问题描述】:

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

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

【问题讨论】:

  • @artlessnoise:我知道可以创建一个 C 数组,但我不知道这是否是最好的方法。如果任何Keil工具可以直接合并二进制文件,那就更好了。可以生成适当目标文件的第三方(例如 gnu)文件不会那么好,但可能仍然比将二进制文件转换为 C 格式更好。
  • 嗯,好吧,我不太确定你的问题在问什么。请参阅此armcc section 文档。根据我的阅读,Keil 是旧的armcc参考:Keil wiki。您可以注释“C”数组以将其放在您喜欢的任何部分;无论是汇编器、编译器还是链接器,这些解决方案看起来都很相似。
  • @artlessnoise:我想做的是让调试器最终加载远程代码二进制文件以及已加载项目的可执行映像,无需进行转换它是一个 C 源文件中的一堆数字。我希望 C 编译器包含一个指令,以使用特定二进制文件中的数据初始化 C 数组;这些东西经常需要,尤其是在编写嵌入式系统时。
  • 你的意思是一个假设的char my_data[] = { #include "file.bin" };?这与所有建议基本相同?我看到这更好一点,但我看不出它对我们有什么好处。它实际上并不比objcopymake 驱动的“C”汇编文件创建或链接器直接包含更易于维护。二进制文件最终成为二进制文件。这是 *nix 脚本的美妙之处;您可以快速制作工具/脚本来执行此操作,例如 printfhexdump 组合,您可以使用 make 规则明智地重新生成文件。当然其他操作系统也有这些工具!

标签: arm build-process keil


【解决方案1】:

你可以像这样从带有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按摩二进制文件的字节序。

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

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

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

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

【讨论】:

  • objcopy 是 Keil 系统捆绑的工具之一吗?我如何找到有关它的信息? Keil 帮助系统好像有点傻?
  • 一个 GNU 工具,独立于 Keil,是您使用的任何发行版的 binutils 包的一部分。 gnu.org/software/binutils
  • 另见:SO bit2C question。有很多程序可以将二进制文件转换为 'C' 数组。 *nix 上还有hexdump,可以生成你想要的文件。另外:SO:Which program to c array?
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2013-12-12
相关资源
最近更新 更多