Zephyr RTOS 上手:west 装完工具链,20 分钟点亮第一盏 LED
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
第一次用 Zephyr RTOS 编译 blinky,大概率会卡在这个报错上:GCC 在GPIO_DT_SPEC_GET那一行抛出error: '__device_dts_ord_DT_N_ALIAS_led_P_gpios_IDX_0_PH_ORD' undeclared。Zephyr RTOS 是面向资源受限设备的可扩展实时操作系统,覆盖 ARM、x86、ARC、RISC-V 等架构,内核可裁剪到几 KB。这个报错不是工具链坏了,而是你选的板卡 devicetree 里没有声明led0别名,GPIO 句柄根本生成不出来。文章按"装工具链 → QEMU 无硬件跑通 → 读懂 blinky → 排查卡点"的顺序走完一遍,全程命令都可以直接复制。
把工具链一次装齐:west 的 5 条命令
Zephyr 用 west 做工作区管理,仓库根目录的 west.yml 把 HAL、加密库等几十个外部模块的 revision 全部钉死,所以装环境本质就是"拉工作区 + 装 SDK"两件事。
- 装系统依赖。以 Ubuntu 为例(Fedora / Arch 是同一组包名的 dnf / pacman 变体,清单见 doc/develop/getting_started/installation_linux.rst):
sudo apt install --no-install-recommends git cmake ninja-build gperf ccache \ dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \ xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1- 建虚拟环境并装 west:
python3 -m venv ~/zephyrproject/.venv source ~/zephyrproject/.venv/bin/activate pip install west- 拉工作区。仓库地址用 https://link.gitcode.com/i/451078e5160845043c3d9ab091579b6d:
west init -m https://link.gitcode.com/i/451078e5160845043c3d9ab091579b6d --mr main ~/zephyrproject cd ~/zephyrproject west update- 导出环境变量并装 Python 依赖:
west zephyr-export west packages pip install- 装 Zephyr SDK(含各架构交叉编译器、QEMU、OpenOCD):
west sdk install版本要求就两条,卡住先查这两项:
| 依赖 | 要求 | 说明 |
|---|---|---|
| CMake | ≥ 3.28 | 仓库示例的 CMakeLists 里是cmake_minimum_required(VERSION 3.28.0),老版本会直接 FATAL_ERROR |
| Python | 3.x,建议 venv | west和west packages都装在 venv 里 |
仓库根目录的 VERSION 显示当前主干是 4.4 开发版,west update拉下来的就是它。
没有开发板也能跑:在 QEMU 里点着 Zephyr RTOS 的第一盏灯
没买板子也别跳过实践。Zephyr 在 boards/qemu/ 下维护了一组虚拟板卡,qemu_x86的 devicetree 里定义了虚拟 LED(带led0别名),blinky 可以直接在上面跑:
cd ~/zephyrproject/zephyr west build -b qemu_x86 -p always samples/basic/blinky west build -t run第二条命令等于"编译 + 用 QEMU 跑起来"。串口号上每秒刷一行LED state: ON/LED state: OFF,QEMU 窗口里那颗绿色小灯同步闪烁。跑通这一步,工具链、设备树、内核、串口控制台整条链路就都验证过了。之后换真实板卡,只是-b的板卡名变了,流程不变。
有板子了怎么烧:一条 west flash
手里有板子(boards/index.rst 里能查到名字的那种,从 Adafruit、Nordic 到 NXP 的板子都支持)时,流程就三步:
west build -b <board-name> -p always samples/basic/blinkywest flash—— 用哪个调试器由板卡配置决定,J-Link、OpenOCD、DAPLink 等常见 runner 都内置了- 烧录失败时
west flash --runner <runner名>显式指定调试工具,多数"烧不进去"都是 runner 选错或线没接好
blinky 只有 48 行:设备树别名怎么变成 GPIO 句柄
跑通之后值得把源码读一遍,samples/basic/blinky/src/main.c 总共 48 行,核心就这两行:
#define LED0_NODE DT_ALIAS(led0) static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);因果链是这样的:led0是 devicetree 里的 alias,板卡的 .dts 把它指向具体引脚;DT_ALIAS在编译期展开成节点 ID;GPIO_DT_SPEC_GET再用这个 ID 取出"哪个 GPIO 控制器、哪个引脚、什么极性"的gpio_dt_spec结构体。所以板卡 dts 里没写led0,这一行就编译不过——开头那个报错的根因就在这。
再看 samples/basic/blinky/prj.conf,整个文件只有一行:
CONFIG_GPIO=yZephyr RTOS 的 Kconfig 体系只编译你显式开启的模块,这就是内核能压到几 KB 的原因,也是后面"改三行 conf"能玩出花样来的基础。
改三行 conf,让 Zephyr RTOS 的日志和 shell 跑起来
自己的应用建好后(CMakeLists.txt+prj.conf+src/main.c三件套,照 samples/hello_world/ 抄即可),往prj.conf里加三行:
CONFIG_LOG=y CONFIG_SHELL=y CONFIG_SHELL_BACKEND_SERIAL=y然后:
- 代码里
#include <zephyr/logging/log.h>,注册LOG_MODULE_REGISTER(main)后用LOG_INF("...")打日志; west build -t run之后,QEMU 串口控制台可以直接敲help、kernel threads等命令,实时看到线程栈水位和状态;- 想逐项翻选项,
west build -t menuconfig开图形界面,比手改 conf 稳妥。
仓库结构速读:boards、soc、drivers 谁管什么
能跑起来之后,花十分钟把仓库顶层过一遍,后面查问题会快很多:
boards/—— 约 140 家厂商,每块板一个目录,装 dts、defconfig 和文档。boards/nordic/ 和 boards/st/ 是里面最大的两个。soc/—— SoC 级代码,一家一目录,管启动、链接脚本、内存布局。dts/bindings/—— 4000 多个设备绑定定义(yaml),写 dts 时属性名拿不准就来这里对。drivers/—— 按设备类型分的 100 多个驱动类:gpio/、serial/、flash/、ethernet/ 等。kernel/—— 调度、线程、超时这些核心;subsys/—— 网络、蓝牙、shell、logging、fs 等子系统。samples/和tests/—— 示例当教程读,tests/ 有 1.5 万个文件,仓库里相当一部分体积是测试用例。
卡住时按顺序查这 4 处
- ⚠️
led0相关编译错误:看 build 目录下生成的 .dts 文件,确认led0alias 存在、父节点compatible = "gpio-leds"。没有就照 samples/basic/blinky/README.rst 里 "Adding board support" 的示例补上。 west: command not found:venv 没激活。source ~/zephyrproject/.venv/bin/activate再试。- CMake 报版本不够:本仓库需要 3.28+,
cmake --version查看,Ubuntu 上sudo snap install cmake最省事。 - 烧录失败:先核对
-b的板卡名和实际板子完全一致(含_rev部分),再用west flash --runner显式指定调试器。
接下来可以做的 3 件事
- 给自己的板子加 LED:照 samples/basic/blinky/README.rst 的 "Adding board support" 在板卡 overlay 里声明
led0,重编 blinky,把开头那个报错亲手消掉。 - 读一个完整驱动:打开 drivers/gpio/ 找你芯片对应的驱动,通读一遍,再对照 dts/bindings/ 里对应绑定,看 dts 属性是怎么映射成驱动参数的。
- 往内核里走一层:线程、同步、调度的文档在 doc/kernel/;想看 4.4 这版新增了哪些特性,查 doc/releases/ 的发布说明。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考