搭建嵌入式 Linux 实验室并不需要昂贵设备。先在 QEMU 中完全不使用硬件起步,然后添加一块文档完善的开发板和一个 3.3V USB 转串口适配器,再增加逻辑分析仪,最后只有在真正遇到问题时才考虑 JTAG 调试器。每个阶段都能培养一项具体实用的技能,按照这个顺序投入能让你持续学习而非单纯购物。

大多数想学习嵌入式 Linux 的人在第一个月都在纠结该买什么硬件。这其实是错误的切入点。一个好的嵌入式 Linux 实验室只需要一小套精心挑选的工具,让你能练习该领域的核心任务:启动开发板、接入串口控制台、驱动外设以及排查故障。价值在于你能完成的任务,而非你拥有的硬件。本教程按从低到高的成本分四阶段搭建实验室,并说明每个阶段能学到的技能。

为什么嵌入式 Linux 实验室很重要

只阅读文档无法教会你:在接好串口却毫无输出时,如何判断是波特率、接线还是内核根本没走到控制台的问题。嵌入式 Linux 实验室让你可以在自己的时间里犯这些错误,并建立真正可重复的练习。下面的每个阶段都可以在本周内完成,每完成一个阶段,你都能用具体的方式描述:「我启动了这块板子,控制台没反应,我是这样一步步排查的。」

需要准备什么

本教程假设你使用 Linux 主机。全文以 Ubuntu 或 Debian 为例;在 Windows 上可使用 WSL2 并在其中运行相同命令。开始前先在主机上安装一次工具:

[email protected]:~$ sudo apt update
[email protected]:~$ sudo apt install build-essential git bc libncurses-dev qemu-system-arm picocom i2c-tools

Enter fullscreen mode Exit fullscreen mode

这套工具覆盖后续所有阶段:build-essentialgitbclibncurses-dev 用于编译 Buildroot 和运行 make menuconfigqemu-system-arm 用于第一阶段;picocom 用于第二阶段的串口控制台;i2c-tools 用于第三阶段。

第一阶段:在 QEMU 中起步,无需购买硬件

最便宜的开发板就是「没有开发板」。QEMU 可在笔记本上启动完整的 ARM 或 ARM64 Linux 系统,让你免费练习整个构建与启动流程。前几周应把精力放在这里。Buildroot 提供了面向 QEMU 机器的现成配置。在 Linux 主机上:

[email protected]:~$ git clone https://git.buildroot.net/buildroot
[email protected]:~$ cd buildroot
[email protected]:~$ make list-defconfigs | grep qemu
[email protected]:~$ make qemu_aarch64_virt_defconfig
[email protected]:~$ make menuconfig
[email protected]:~$ make

Enter fullscreen mode Exit fullscreen mode

make menuconfig 步骤,首次可直接接受默认值——这个步骤是为了以后修改选项准备的,并非必须现在编辑。构建完成后会生成内核镜像和根文件系统。最简单的启动方式是使用 Buildroot 写入 output 目录的现成脚本 start-qemu.sh

[email protected]:~$ ./output/images/start-qemu.sh

Enter fullscreen mode Exit fullscreen mode

如果你想看到完整命令,以下是等效的直接调用:

[email protected]:~$ qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -kernel output/images/Image -append "rootwait root=/dev/vda console=ttyAMA0" -drive file=output/images/rootfs.ext4,if=virtio,format=raw

Enter fullscreen mode Exit fullscreen mode

要退出 -nographic 模式的 QEMU 会话,请按 Ctrl-A 再按 x。仅凭这些,你就可以练习内核配置、配置变更后重新构建,以及为目标平台交叉编译程序。在这里培养的技能——交叉编译、内核配置、组装根文件系统——正是 BSP(板级支持包)岗位所需的。唯一 QEMU 无法教给你的是真实硬件行为,这将留到第二阶段。

动手试试 → 在花任何钱之前,先在 QEMU 中构建并启动一个 Buildroot 镜像,然后添加一个软件包后再重新构建。如果你能凭记忆完成这些操作,就已准备好迎接真实开发板。

第二阶段:第一块开发板与串口控制台

转向硬件后,应优先选择文档完善且有主线支持的开发板,而非单纯追求速度。一块具备完整技术参考手册和上游内核支持的开发板,能让你学到比「更快但启动流程部分闭源」的开发板更清晰的工作流。

BeagleBone Black 是不错的首选:它采用德州仪器 AM335x SoC(单核 Cortex-A8),主线内核与 U-Boot 均支持,且文档细致到原理图。Raspberry Pi 4 或 5 也可以,社区庞大,但其启动流程先运行专有的 VideoCore 固件,再启动 ARM 核心,因此对标准嵌入式启动流程的教学价值较低。两者都可用,关键在于清楚各自能教会你什么。

开发板之后最重要的工具是 3.3V USB 转 TTL 串口适配器。这是你接入调试控制台的途径——在网络尚未建立前,U-Boot 和内核会在这里输出信息。基于 FT232R、CP2102 或 PL2303 芯片的适配器价格低廉。必须使用 3.3V 版本:5V 版本可能损坏开发板的 UART 引脚。

将三根线连接到开发板的调试串口排针(BeagleBone Black 上是 6 针 J1 排针),交叉连接 TX/RX:适配器 TX 接开发板 RX,适配器 RX 接开发板 TX,GND 接 GND。不要连接适配器的 Vcc 或 5V 引脚——开发板自行供电。之后打开终端:

[email protected]:~$ picocom -b 115200 /dev/ttyUSB0

Enter fullscreen mode Exit fullscreen mode

如果提示权限错误,说明当前用户不在 dialout 组中。执行一次以下命令并重新登录:

[email protected]:~$ sudo usermod -aG dialout $USER

Enter fullscreen mode Exit fullscreen mode

调试控制台默认参数为 115200 波特率、8 数据位、无校验、1 停止位(简称 8N1)。minicomscreen /dev/ttyUSB0 115200 也能完成同样工作。部分适配器会显示为 /dev/ttyACM0 而非 /dev/ttyUSB0。第一次给开发板上电并看到 U-Boot 输出时,你就从理论进入了真正的嵌入式工作。

动手试试 → 在真实开发板上获取串口控制台,并在 U-Boot 倒计时时中断它。学会在 U-Boot 提示符下停止并读取环境变量,这项技能会在每个项目中用到。

第三阶段:与真实外设通信

开发板启动后,下一个技能是连接设备并从 Linux 驱动它。一个廉价的 I2C 传感器模块(如 TMP102 温度传感器)就足够。首先列出内核暴露的 I2C 总线,以便使用正确的总线编号(编号不一定与排针上的标签一致):

[email protected]:~$ sudo i2cdetect -l
i2c-1   i2c OMAP I2C adapter    I2C adapter

Enter fullscreen mode Exit fullscreen mode

然后扫描该总线上的设备。使用 sudo,因为 I2C 设备节点默认不可被普通用户访问:

[email protected]:~$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
...
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --

Enter fullscreen mode Exit fullscreen mode

出现的地址(此处为 0x48)表示设备已正确连接并供电。如果扫描结果只有短横线,可能是接线错误或总线未启用——许多开发板需要在设备树中先启用 I2C 控制器及其引脚,总线才能工作。

接下来通过设备树向内核描述该设备,以便驱动能认领它。关键是在 I2C 控制器节点下添加一个子节点,指定设备的 compatible 字符串和总线地址 reg。以设备树 overlay 的形式大致如下:

&i2c1 {
    status = "okay";

    tmp102@48 {
        compatible = "ti,tmp102";
        reg = <0x48>;
    };
};

Enter fullscreen mode Exit fullscreen mode

编译并加载 overlay 的方法因开发板而异,值得单独学习,但效果在所有平台上都相同:一旦匹配的驱动绑定成功,设备就会以「总线-地址」的形式出现在 sysfs 中:

[email protected]:~$ ls /sys/bus/i2c/devices/
1-0048  i2c-1

Enter fullscreen mode Exit fullscreen mode

这只需很少的投入——几个传感器模块和杜邦线——但却是让设备树与驱动技能真正落地的阶段。在设备树中添加设备并观察内核绑定驱动,正是板级支持工作中的核心内容。

第四阶段:逻辑分析仪与 JTAG 调试器

最后两件工具用于在串口控制台无法解释问题时使用。等到真正遇到需要它们的故障时再购买,而非提前入手。

低成本 USB 逻辑分析仪可让你看到 I2C、SPI 或 UART 线路上的实际信号。开源项目 sigrok 及其前端 PulseView 支持多种廉价分析仪,并能自动解码这些协议。当传感器返回异常数据时,分析仪能显示总线是否真的产生了你期望的比特,让猜测变成测量。

JTAG 或 SWD 调试器应最后考虑。配合 OpenOCD 和基于 FTDI 的探针或 J-Link——或者使用自带 GDB 服务器、无需 OpenOCD 的 Black Magic Probe——你可以暂停处理器并单步执行底层代码。这对调试引导加载程序或在控制台尚未就绪前的极早期内核启动非常有用。初学者在前几个月很少需要它,因此不应作为早期购买项目。

基础数字万用表值得一直放在工作台上:检查电压轨或通断往往比任何软件工具更快地解释「死板」的原因。如果你想深入完整的板级支持与驱动开发流程,这些工具正是我们 Embedded Linux Mastery Track 的核心内容。

动手试试 → 不要在第一天就购买逻辑分析仪或 JTAG 探针。等到真正遇到需要它们的 bug 时再添置——那时你对工具的理解会深刻得多。

关键要点

  • 零成本: 在你已有的电脑上使用 QEMU + Buildroot,可在不花钱的情况下学会完整的构建与启动流程。
  • 低成本: 首批采购是一块文档完善、支持主线的开发板和一个 3.3V USB 转串口适配器——调试控制台(115200 8N1)是你在每个项目中都会用到的工具。
  • 低成本: 几个传感器模块和杜邦线就能把设备树与驱动知识转化为真实技能。
  • 按需购买: 仅在遇到真正需要它们的 bug 时再添加逻辑分析仪,之后再考虑 JTAG 或 SWD 探针。
  • 让每一次购买都由你想学习的任务驱动,基础万用表则始终有用。

常见问题

学习嵌入式 Linux 必须购买硬件吗?
不需要。QEMU 可在你的电脑上启动完整的 ARM 或 ARM64 Linux 系统,Buildroot 也提供了现成的 QEMU 配置,你可以在完全没有硬件的情况下学习交叉编译、内核配置和根文件系统构建。

第一块开发板应该买哪款?
优先选择文档与主线支持,而非速度。一块文档完整、支持主线的开发板(如 BeagleBone Black)能教给你比 Raspberry Pi 更清晰的工作流——后者启动流程始于专有固件。两者都可用,关键是根据你想学习的内容选择文档更好的那款。

开发板之后最重要的工具是什么?
一个 3.3V USB 转 TTL 串口适配器。它能让你接入调试控制台,U-Boot 和内核会在网络建立前在这里输出信息。请使用 3.3V 版本,避免使用 5V 版本损坏开发板。

初学者需要 JTAG 调试器吗?
不需要。JTAG 或 SWD 调试器主要用于引导加载程序和极早期启动调试,应作为最后购买的工具。仅在串口控制台无法解释问题时再考虑。

延伸阅读


原文发表于 TECH VEDA