当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]当嵌入式项目从“跑个Demo”走向量产,Buildroot的简洁往往不够用——你需要精确控制内核版本、库的ABI兼容性、安全补丁的追溯,甚至为不同SKU生成差异化的镜像。Yocto正是为此而生:它不是一套固化的系统,而是一套元数据和构建框架,让你像搭积木一样组合出专属Linux发行版。


当嵌入式项目从“跑个Demo”走向量产,Buildroot的简洁往往不够用——你需要精确控制内核版本、库的ABI兼容性、安全补丁的追溯,甚至为不同SKU生成差异化的镜像。Yocto正是为此而生:它不是一套固化的系统,而是一套元数据和构建框架,让你像搭积木一样组合出专属Linux发行版。

第一步:搭建Yocto环境

Yocto项目基于Poky参考发行版。推荐在Ubuntu 20.04/22.04 LTS上操作,确保磁盘剩余空间至少50GB(实际构建会占用30-40GB)。

# 安装必要依赖

sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential \

                chrpath socat cpio python3 python3-pip python3-pexpect \

                xz-utils debianutils iputils-ping python3-git python3-jinja2 \

                libegl1-mesa libsdl1.2-dev pylint3 xterm


# 下载Poky(以kirkstone分支为例)

git clone -b kirkstone git://git.yoctoproject.org/poky.git

cd poky

source oe-init-build-env build

执行oe-init-build-env后会自动切换到build目录,并设置好环境变量。

第二步:创建自定义meta层

Yocto通过层(layer)组织代码。不要直接修改poky内的内容,而是创建自己的层来覆盖配置。

bitbake-layers create-layer ../meta-myboard

bitbake-layers add-layer ../meta-myboard

meta-myboard的目录结构如下:

meta-myboard/

├── conf/

│   └── layer.conf

├── recipes-example/

│   └── hello/

│       ├── hello_1.0.bb

│       └── files/

│           └── helloworld.c

└── ...

第三步:添加自定义机器配置

假设你的ARM板使用Cortex-A72处理器,内存2GB,通过eMMC启动。在meta-myboard/conf/machine/下创建myboard.conf:

# meta-myboard/conf/machine/myboard.conf

require conf/machine/include/arm/armv8a/tune-cortexa72.inc


MACHINEOVERRIDES =. "myboard:"


PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"

PREFERRED_VERSION_linux-yocto ?= "5.15%"


UBOOT_MACHINE ?= "myboard_defconfig"


IMAGE_FSTYPES += "ext4 tar.bz2 wic"


SERIAL_CONSOLES = "115200;ttyS0"

MACHINE_FEATURES += " wifi bluetooth"

这里指定了SoC架构、内核版本、U-Boot配置、镜像格式和串口参数。更复杂的硬件还需添加设备树源文件路径。

第四步:编写第一个配方

创建一个简单的“Hello World”应用,验证构建流程。

recipes-example/hello/files/helloworld.c:

#include <stdio.h>

int main() { printf("Hello from Yocto!\n"); return 0; }

recipes-example/hello/hello_1.0.bb:

SUMMARY = "Simple Hello World application"

LICENSE = "MIT"

LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"


SRC_URI = "file://helloworld.c"

S = "${WORKDIR}"


do_compile() {

   ${CC} helloworld.c -o helloworld

}


do_install() {

   install -d ${D}${bindir}

   install -m 0755 helloworld ${D}${bindir}

}

第五步:构建最小镜像

回到build目录,执行构建命令。首次构建会下载工具链和所有依赖,耗时数小时。

bitbake core-image-minimal

完成后镜像位于tmp/deploy/images/myboard/。使用wic工具或dd命令将其写入SD卡/eMMC:

sudo dd if=tmp/deploy/images/myboard/core-image-minimal-myboard.wic of=/dev/sdb bs=4M status=progress

第六步:集成更多功能

Yocto的强大在于组合。想添加Qt5图形栈?只需在local.conf中加入:

IMAGE_INSTALL:append = " qtbase qtdeclarative qtquickcontrols2"

PACKAGECONFIG:append:pn-qtbase = " eglfs gles2"

想启用systemd?修改DISTRO_FEATURES:

DISTRO_FEATURES:append = " systemd"

VIRTUAL-RUNTIME_init_manager = "systemd"

避坑指南

网络问题:国内访问Yocto源较慢,建议配置本地sstate缓存或使用代理。

磁盘空间:构建过程中会生成大量中间文件,tmp/目录动辄20GB+,构建完成后可执行bitbake -c cleanall清理。

内核配置:如果硬件需要特殊驱动,在meta-myboard/recipes-kernel/linux/中添加内核配置文件片段,用SRC_URI:append合并。

调试技巧:bitbake -c devshell <recipe>会打开一个带有完整交叉编译环境的shell,方便手动调试。

写在最后

Yocto的学习曲线确实陡峭——光是理解BitBake语法和数百个变量就需要不少时间。但一旦建立起自己的meta层,后续的产品迭代将变得极其高效:换一颗SoC只需修改machine配置,增加一个功能只需添加一个配方,安全补丁只需升级对应的源。对于需要长期维护的嵌入式产品,Yocto投入的时间成本会在后期加倍回报。从“跑起来”到“管得好”,Yocto是通往专业嵌入式Linux开发的必经之路。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

传统PLC硬件专机价格高、扩展性受限,而ARM+Linux平台成本低、生态丰富。将PLC的梯形图/ST逻辑解释为软件运行时,在ARM Linux上执行,既能保留PLC的可靠性思维,又能利用Linux的网络、存储和图形能力...

关键字: 软PLC 嵌入式Linux ARM

在Zynq、ZU+等SoC FPGA平台上,ARM处理器系统(PS)与可编程逻辑(PL)通过AXI总线紧耦合,让"Linux跑应用+FPGA做加速"成为嵌入式异构计算的主流范式。两者分工清晰:PS负责网络协议、文件系统、...

关键字: 嵌入式Linux FPGA 软硬件协同

当AI模型从云端下沉到产线相机、无人机、农业传感器等边缘节点,算力受限、功耗敏感、实时性要求高成为新常态。轻量模型(MobileNet、YOLO-Nano、TinyBERT)搭配推理加速引擎,可以在几瓦功耗下实现毫秒级推...

关键字: 边缘计算 AI推理 嵌入式Linux

很多刚接触嵌入式Linux的工程师看到arch/arm64/boot/dts/下成片的.dts、.dtsi文件就头大。其实设备树(Device Tree)本质就是一份"硬件简历"——用树形结构告诉内核:板子上有啥外设、挂...

关键字: 设备树 DTS 嵌入式Linux

在SPI NOR Flash只有16MB、甚至8MB的嵌入式板上,每一次字节都很贵。Buildroot的优势在于:一条make menuconfig就能通过交叉编译生成工具链、根文件系统和内核镜像,帮开发者把"臃肿"挡在...

关键字: Buildroot 根文件系统 嵌入式Linux

在嵌入式Linux开发中,同时支持多款ARMv8-A硬件平台是一个常见但不易做好的需求。每款开发板都有自己独特的Bootloader、内核配置、设备树和用户态驱动,若为每款板卡独立维护一套构建配置,维护成本会随硬件种类线...

关键字: Linux Yocto

设备树(Device Tree, DTB)是嵌入式Linux系统中描述硬件的“骨架”。一个错误的status、一个拼错的compatible,就可能导致外设驱动无法加载或系统崩溃。本文总结十个在ARM/Linux设备树编...

关键字: 嵌入式Linux 设备树

在嵌入式Linux开发中,设备树(Device Tree)已成为描述硬件的标准。它让内核与硬件解耦,实现“一份内核,适配万千板卡”。本文将跳过繁杂的理论,直击设备树节点编写与内核驱动匹配的核心流程。

关键字: 嵌入式Linux 设备树 Device Tree

在物联网设备日益普及的今天,固件空中升级(OTA)已成为设备维护和功能更新的标准方式。A/B分区架构结合差分升级技术,能够在保证系统高可用性的同时,显著降低传输数据量,特别适合带宽受限的嵌入式环境。本文将深入探讨A/B分...

关键字: 固件升级 OTA 嵌入式Linux

在嵌入式Linux开发中,设备树(Device Tree)已成为硬件描述与内核解耦的核心机制。传统静态设备树在编译时固化硬件信息,难以适应多变的硬件配置需求。而动态设备树配置技术通过设备树叠加(Overlay)机制,允许...

关键字: 嵌入式Linux 设备树
关闭