【发布时间】: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" };?这与所有建议基本相同?我看到这更好一点,但我看不出它对我们有什么好处。它实际上并不比objcopy、make驱动的“C”或汇编文件创建或链接器直接包含更易于维护。二进制文件最终成为二进制文件。这是 *nix 脚本的美妙之处;您可以快速制作工具/脚本来执行此操作,例如printf和hexdump组合,您可以使用make规则明智地重新生成文件。当然其他操作系统也有这些工具!
标签: arm build-process keil