我是 Embox 开发人员之一,负责构建工具。
Basile has given 对整个过程的正确概述:
- 源代码被编译成可重定位的
embox.o 和ld -r,
- 然后链接到
embox ELF 二进制文件,
- ... 又被转换为
.bin 和.srec 用于经常闪烁。
二进制工件进入build/base/bin。
让我补充一些细节。
首先,您可能不需要深入研究将您的应用程序与 Embox 链接的细节。相反,正确的方法是将您的应用程序集成到Mybuild - Embox 构建系统 - 并让它为您处理低级链接细节。所以值得先构建 vanilla Embox 并在模拟器上运行。
为 ARM 构建和运行 Embox
我建议你从arm/qemu 模板开始。这不适合您的 MCU,但是如果您的应用程序没有做一些不寻常的事情,那么在将其移植到目标 MCU 之前在 QEMU 上对其进行测试会更容易。无论如何,这是一个很好的起点,可以检查开发环境是否健全且一切正常。
在 Linux 上开发真的会让你的生活更轻松,就像 sudo apt-get install build-essential 加上几个包和安装交叉编译器一样。但是,如果您打算在 Windows 上进行开发,您可能会发现 this guide 很有用。此外,您需要修补 make 以使其在 Windows 上运行:Issue 504。这里是how to setup QEMU。
推荐的ARM交叉编译器是官方的GNU Tools for ARM。
所以基本上,以下是准备 Linux 开发机器以构建和运行 Embox for ARM 的步骤:
sudo add-apt-repository -y ppa:terry.guo/gcc-arm-embedded
sudo apt-get update
sudo apt-get install build-essential gcc-arm-none-eabi u-boot-tools qemu-system
克隆存储库:
git clone https://github.com/embox/embox embox
cd embox
构建arm/qemu:
make confload-arm/qemu
make
confload 目标使用名为arm/qemu 的预定义模板初始化conf/ 目录。 conf/ 是目标图像(Embox + 您的应用)的配置所在的位置。
运行 QEMU。有一个方便的包装器,它从 Embox 配置中推断出必要的选项并正确运行 QEMU:
sudo ./scripts/qemu/auto_qemu
如果一切顺利,您会看到like that。键入 help 以列出可用的命令。
将您的应用程序添加为 Embox 命令
就我个人而言,当我尝试新事物时,我通常会“模仿”其他人的方法,以便从应用程序/系统中获得第一批反馈。在这里,我建议导出,例如一个现有的cat command,扔掉它的所有东西,有效地将它变成一个 Hello world 应用程序。
现在,在src/cmds 中创建一个目录hello 并在其中添加两个文件:
hello.c文件
/**
* Plain C Hello World application.
*/
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello world!\n");
return 0;
}
如您所见,这是一个普通的 C 程序,不使用任何特定于 Embox 的 API。现在让我们将它集成到 Embox 中。
Hello.my文件
(refer to Cat.my):
package embox.cmd.hello
@AutoCmd
@Cmd(name = "hello",
help = "<This is what `help hello` will output>",
man = '''
<What is shown when running `man hello`>
''')
module hello {
source "hello.c"
depends embox.compat.libc.all // for stdio
}
现在将新定义的模块添加到配置中。
conf/mods.config文件
package genconfig
configuration conf {
...
include embox.cmd.hello.hello
}
构建并运行
运行make。这将编译 hello.c 并将其与 Embox 适当地链接。之后,使用sudo ./scripts/qemu/auto_qemu 运行它并在embox>prompt 中输入hello。
就是这样。
关于您的问题
总结一下:
Embox 源代码被编译(通过make)到某个文件(目标文件?),<file>.<ext>
同时,我的应用程序的源代码被交叉编译(不知何故)成一个与 Embox 兼容的 Object 文件(myapp.o)
您的应用程序和 Embox 本身都使用常规(交叉)编译器 defined in conf/build.conf 通过 CROSS_COMPILE 变量进行编译。
一些工具结合了:(a) make 生成的 Embox <file>.<ext>,(b) myapp.o 和 (c) 我指定的任何其他库。它将这些作为输入并生成一个可以通过 JTAG 刷新的应用程序映像
这些在构建过程中与ld 链接。
在 Embox 源代码上运行 make 生成的 Embox“工件”的确切名称和文件扩展名是什么?根据您使用的是 Windows 还是 Mac,此工件是否有所不同?
主要的构建工件是build/base/bin/embox(ELF)和build/base/bin/embox.bin(二进制)。如果我没记错的话,这些在所有构建平台上都具有相同的扩展名(好吧,可能会有embox.exe 而不是embox,但这不太可能)。
除了make 之外还需要哪些工具来制作这个工件?
本质上是交叉编译器。 GNU Tools for ARM embedded processors 是个不错的选择。
加上 Windows 的一些怪癖(见上文)。
这个可以接收对象/临时文件并生成单个应用图像的神奇工具是什么?此应用图像的确切名称和文件扩展名是什么?
没有这样的魔法工具。 :)
我需要哪些工具将myapp.c 和myapp.h 交叉编译成与Embox 兼容的myapp.o?
这又一次隐藏在 Mybuild 之下。简而言之,它:
- 使用交叉编译器将
myapp.c编译成myapp.o
- 如果应用程序被定义为
@AutoCmd 模块,它:
- 通过存储指向
main 的指针以及名称等元数据在命令注册表中注册应用程序
- 从目标文件中去除
main 符号,以防止多个应用程序发生冲突
- 链接
myapp.o,因为它是Embox的一部分到embox.o,然后到embox ELF