OpenIPC开源IPC之工程框架
1. 源由
OpenIPC的工程框架使用了Buildroot,该构建工具与OpenWrt、OpenEmbedded、Yocto类似,被广泛应用于嵌入根文件系统自动化构建。
2. 介绍
Buildroot 通过使用交叉编译来简化和自动化构建嵌入式系统完整 Linux 系统。
Buildroot 作为一个用于构建嵌入式 Linux 系统的工具,有其独特的优缺点。以下是对其主要优势和劣势的概述:
优点
-
轻量化和简洁性
- Buildroot 非常轻量化,且设计简洁。它的配置和使用相对简单,对于小型和中型嵌入式项目,特别是那些不需要高度定制的系统,Buildroot 是一个非常高效的工具。
-
快速构建
- Buildroot 可以快速生成一个完整的 Linux 根文件系统、内核和引导加载程序。这使得它非常适合开发过程中频繁迭代测试的情况。
-
广泛的硬件支持
- Buildroot 支持多种处理器架构(如 ARM、MIPS、PowerPC、x86 等)和大量现成的开发板,适合广泛的嵌入式应用。
-
简单的配置机制
- Buildroot 使用的
make menuconfig
、make xconfig
等配置工具类似于 Linux 内核的配置方式,使得用户能够轻松配置所需的工具链、软件包和其他系统组件。
- Buildroot 使用的
-
良好的文档和社区支持
- Buildroot 拥有良好的文档支持和一个活跃的开发者社区,用户可以快速找到所需的信息和帮助。
-
自包含的构建系统
- Buildroot 的构建过程不依赖于宿主系统的许多软件包,而是通过下载并构建所需的一切(包括工具链),这减少了环境依赖性和不一致性的问题。
缺点
-
缺乏包管理系统
- Buildroot 没有像 Yocto 或 OpenEmbedded 那样的包管理系统,这意味着在运行时不能方便地添加或移除软件包。所有的软件包都必须在构建时选择并编译进系统。
-
功能相对简单
- Buildroot 的设计目标是简单和快速,因此它在复杂项目中的灵活性和功能性上可能不如 Yocto 等更强大的构建系统。如果项目需要高度定制和复杂的功能集成,Buildroot 可能不足以满足需求。
-
不支持多重构建缓存
- Buildroot 通常是一次性构建所有内容,如果需要重新构建某个部分,通常需要重新构建整个系统。这与支持增量构建和更复杂缓存机制的 Yocto 有所不同,可能导致开发效率下降。
-
有限的系统集成能力
- Buildroot 更适合简单或中等复杂度的系统。如果项目需要广泛的定制或复杂的集成,如定制 BSP 或复杂的中间件系统,可能需要更强大的构建工具。
-
软件包数量有限
- 虽然 Buildroot 提供了许多常见的嵌入式软件包,但与 Yocto 等系统相比,其软件包数量和可用性要少一些。这可能意味着你需要自己编写新的包定义或补丁。
适用
Buildroot 主要对从事嵌入式系统开发的人有用,非常适合那些需要快速生成嵌入式 Linux 系统的项目,特别是对于资源有限的设备或不需要高度复杂和定制的系统。
3. 框架
Buildroot 基本上是一组 Makefile,它们负责下载、配置和编译软件,并确保使用正确的选项进行编译。它还包括为各种软件包提供的补丁,主要是与交叉编译工具链相关的软件包(如 gcc、binutils 和 uClibc)。
基本上,每个软件包都有一个对应的 Makefile,这些文件以 .mk 为扩展名。Makefile 分为许多不同的部分。
toolchain/
目录包含了与交叉编译工具链相关的所有软件的 Makefile 和相关文件:如 binutils、gcc、gdb、kernel-headers 和 uClibc。arch/
目录包含了所有 Buildroot 支持的处理器架构的定义。package/
目录包含了所有用户空间工具和库的 Makefile 和相关文件,这些工具和库可以由 Buildroot 编译并添加到目标根文件系统中。每个软件包都有一个子目录。linux/
目录包含了 Linux 内核的 Makefile 和相关文件。boot/
目录包含了 Buildroot 支持的引导加载程序的 Makefile 和相关文件。system/
目录包含了系统集成的支持文件,例如目标文件系统框架和初始化系统的选择。fs/
目录包含了与生成目标根文件系统镜像相关的软件的 Makefile 和相关文件。
每个目录至少包含 2 个文件:
something.mk
是 Makefile,负责下载、配置、编译并安装名为something
的软件包。Config.in
是配置工具描述文件的一部分,描述了与该软件包相关的选项。
主 Makefile 在配置完成后执行以下步骤:
- 在输出目录(默认是
output/
,可以使用O=
指定其他值)中创建所有输出目录:如 staging、target、build 等。 - 生成工具链目标。如果使用的是内部工具链,这意味着生成交叉编译工具链。如果使用的是外部工具链,这意味着检查外部工具链的功能并将其导入 Buildroot 环境。
- 生成 TARGETS 变量中列出的所有目标。该变量由所有单独组件的 Makefile 填充。生成这些目标将触发用户空间软件包(库、程序)、内核、引导加载程序的编译以及根文件系统镜像的生成,这取决于配置。
4. 举例
以ssc338q_fpv_openipc-urllc-aio_defconfig
目标OpenIPC AIO为例,定位底层实时传输代码wfb-ng
,接下来我们看下如何集成该软件包。
Step 1: 配置使能wfb-ng
软件包
在OpenIPC/builder
工程的devices/ssc338q_fpv_openipc-urllc-aio/br-ext-chip-sigmastar/configs/ssc338q_fpv_openipc-urllc-aio_defconfig.txt
目标配置文件中配置使能软件包:
BR2_PACKAGE_WIFIBROADCAST=y
Step 2: 添加wfb-ng
软件包
在openipc/general/package/wifibroadcast/
路径下,增加必要文件,包括:Config.in
和wifibroadcast.mk
openipc/general/package/wifibroadcast/
├── files
│ ├── drone.key
│ ├── gs.key
│ ├── htc_9271.fw.1
│ ├── htc_9271.fw.3
│ ├── setmcs
│ ├── wfb_drone.conf
│ ├── wfb_gs.conf
│ └── wifibroadcast
├── Config.in
└── wifibroadcast.mk
Step 3: 软件包版本配置
在openipc/general/package/wifibroadcast/wifibroadcast.mk
中配置版本信息:
WIFIBROADCAST_VERSION = 24.08
Step 4: 地面端配置OSD
在./openipc/br-ext-chip-hisilicon/configs/hi3536dv100_fpv_defconfig
中增加OSD配置项:
BR2_PACKAGE_VDEC_OPENIPC=y
5. 参考资料
【1】OpenIPC开源IPC之工程编译
【2】Ardupilot & OpenIPC & 基于WFB-NG构架分析和数据链路思考