【问题标题】:Embox compilation and flashingEmbox编译和刷机
【发布时间】:2015-05-13 02:23:48
【问题描述】:

我有兴趣尝试通过 JTAG 从 Windows 或 Mac 机器(交叉编译)编译、打包和闪存 Embox 到 MCU,我有很多顾虑。

观察我认为编写 Embox 应用程序并将它们部署/刷新到 MCU 的正常方式:

如你所见,在我的理解上面:

  • Embox 源代码被编译(通过make)到某个文件(目标文件?),<file>.<ext>
  • 同时,我的应用程序的源代码被交叉编译(不知何故)成一个与 Embox 兼容的 Object 文件(myapp.o)
  • 一些工具结合了:(a) make 生成的 Embox <file>.<ext>,(b) myapp.o 和 (c) 我指定的任何其他库。它将这些作为输入并生成一个可以通过 JTAG 刷新的应用程序映像

我的顾虑,也在插图中指出:

  • 在 Embox 源代码上运行 make 生成的 Embox“工件”的确切名称和文件扩展名是什么?根据您使用的是 Windows 还是 Mac,此工件是否有所不同?除了make 之外,还需要哪些工具来制作这个工件?
  • 这个可以接收对象/临时文件并生成单个应用程序图像的神奇工具是什么?此应用图片的确切名称和文件扩展名是什么?
  • 我需要哪些工具将myapp.cmyapp.h 交叉编译成与Embox 兼容的myapp.o

【问题讨论】:

    标签: c linker operating-system real-time


    【解决方案1】:

    我是 Embox 开发人员之一,负责构建工具。

    Basile has given 对整个过程的正确概述:

    • 源代码被编译成可重定位的embox.old -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&gt;prompt 中输入hello

    就是这样。

    关于您的问题

    总结一下:

    Embox 源代码被编译(通过make)到某个文件(目标文件?),&lt;file&gt;.&lt;ext&gt; 同时,我的应用程序的源代码被交叉编译(不知何故)成一个与 Embox 兼容的 Object 文件(myapp.o)

    您的应用程序和 Embox 本身都使用常规(交叉)编译器 defined in conf/build.conf 通过 CROSS_COMPILE 变量进行编译。

    一些工具结合了:(a) make 生成的 Embox &lt;file&gt;.&lt;ext&gt;,(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.cmyapp.h 交叉编译成与Embox 兼容的myapp.o

    这又一次隐藏在 Mybuild 之下。简而言之,它:

    • 使用交叉编译器将myapp.c编译成myapp.o
    • 如果应用程序被定义为@AutoCmd 模块,它:
      • 通过存储指向main 的指针以及名称等元数据在命令注册表中注册应用程序
      • 从目标文件中去除main 符号,以防止多个应用程序发生冲突
    • 链接myapp.o,因为它是Embox的一部分到embox.o,然后到embox ELF

    【讨论】:

    • 想帮助您将工具集成到 ALT Linux 中? ;-)(我是它的开发者之一)
    • 感谢您的好意!集成到 ALT Linux 到底是什么意思?在仓库中提供对应的包?
    • 是的,所以上述 HOWTO 中与 apt 相关的部分也可能会被改编。当然,如果您或您的用户中的任何一个人倾向于使用 ALT,这仍然是有意义的。 :) (我们可能会接受这些包到 repos 中,而无需添加任何东西)
    • @Michael 抱歉回复晚了,我一直在度假。问题是本指南仅是关于构建 Embox。整个 Mybuild 是 Embox 的构建系统,目前它是 Embox 的一部分。有人尝试将这些项目分开,但这仍在开发中。无论如何,一旦我们准备好用于任意项目的工具,我很乐意通知您!
    • заранее благодарен :-)
    【解决方案2】:

    这是我第一次听说 Embox,但将 Embox 与您的代码结合使用的工具显然是 linker(所以是 ldbinutils 的交叉,请参阅 documentation of ld)。要了解有关链接器的更多信息,请阅读 Levine 的书 Linkers and loaders

    编译 Embox 源代码生成的 Embox 可能是一个库 (libembox.a),或者是一个可重定位的目标文件 embox.o - 可能由 ld -r 生成。

    生成的应用程序映像可能是原始二进制文件 (.bin),但如果由 GRUB 加载程序加载,它可能是 ELF 文件。

    我猜构建过程和Linux内核构建过程很相似。

    顺便说一句,我想在 Linux 系统上开发可能会更简单,因为 Linux 每天都使用相同类型的工具。因此,您可以在开发笔记本电脑上安装 Linux。

    您需要一个交叉编译器(针对您的目标平台)来编译您的代码以与 Embox 结合。

    【讨论】:

    • 感谢@Basile Starynkevitch (+1) - 我将在 Windows 或 Ubuntu 上开发我的应用程序并将最终应用程序(与 Embox 内核集成)刷写到 ARM SAM3X8E 微控制器上(显然 Linux 是'不是一个选项)。你知道这个平台的任何交叉编译器吗?您知道与 Embox 兼容的特定交联剂吗?再次感谢!
    • 我猜一些最近的 GCC 可以配置为你的 ARM 的交叉编译器。我不知道详情
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2020-05-20
    相关资源
    最近更新 更多