news 2026/9/29 3:31:24

Zephyr应用: 08-Devicetree

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zephyr应用: 08-Devicetree

第 08 课:Devicetree(设备树)— Zephyr 最重要的知识之一

摘要:本课系统讲解 Zephyr 的 Devicetree(设备树)机制。你将理解 Zephyr 为何用 Devicetree 解耦应用与硬件、掌握.dts/.dtsi/.overlay文件的作用与关系,学会通过app.overlay修改板级配置(如 LED、UART),并掌握compatible、status、aliases、chosen等核心概念。最后通过 4 个 ESP32-S3 实验,学会用DT_ALIAS()、DEVICE_DT_GET()、GPIO_DT_SPEC_GET()等宏在 C 代码中读取设备树信息,实现应用代码与具体开发板解耦。

目标:掌握 Zephyr 的 Devicetree,学会修改板级硬件配置,并能够在应用程序中读取 Devicetree 信息。

为什么要学习 Devicetree?

在 STM32Cube 或 ESP-IDF 中,我们通常这样写:

#defineLED_GPIOGPIOA#defineLED_PIN5

如果换一块板子,就要修改源码。
Zephyr 不希望这样。
它希望:
程序完全不知道 LED 接在哪里。

程序只知道LED0,真正接在哪里,由 Devicetree 决定。
因此:

Application │ ▼ Devicetree │ ▼ Board Hardware

这也是 Zephyr 能支持数百块开发板的重要原因。

Devicetree 的作用

它主要描述两件事情:
MCU 上有哪些硬件;
每个硬件如何连接、配置和初始化。
例如:

UART1 SPI2 GPIOA LED Button I2C Flash

全部放进 DTS。程序不用再写GPIO_NUM_5,而是写led0。

Devicetree 文件有哪些?

对于 ESP32-S3:

boards/ espressif/ esp32s3_devkitc/

里面通常有:

esp32s3_devkitc.dts esp32s3_devkitc_defconfig Kconfig.board

应用程序可以增加:

app.overlay

通常目录如下:

my_app │ ├── src │ main.c │ ├── prj.conf │ ├── CMakeLists.txt │ └── app.overlay

以后99% 的修改都放在 overlay,不要直接修改官方 .dts。

为了帮助你快速区分三种文件的使用场景,下面用一张表格对比.dts、.dtsi、.overlay:

文件类型作用修改场景注意事项
.dts描述某块具体开发板的完整设备树,是最终编译的入口一般不要修改,它由板级厂商维护修改后升级 SDK 会被覆盖;改动应尽量放到 overlay
.dtsi存放可复用的公共设备树片段(如 SoC 定义、通用外设),被.dts通过#include引入通常不需要修改,除非要定制 SoC 级默认配置改动会影响所有引用它的板子,风险较大
.overlay应用级覆盖文件,在编译时叠加到板级 DTS 之上99% 的应用修改都放这里:新增/修改/禁用节点、改 GPIO、改 UART 等只影响当前应用,不污染官方文件;是 Zephyr 推荐的扩展方式

简单记忆:.dts是板子的“底图”,.dtsi是公共“零件库”,.overlay是应用自己的“贴纸”。

Overlay 是什么?
Zephyr 会先读取:
官方 Board DTS
然后读取:

app.overlay

Overlay 可以:

新增节点 修改节点 禁用节点 修改 GPIO 修改 UART

例如:
官方:

UART0 ↓ Overlay:

UART0 波特率改成 115200

一个 LED 节点
例如:

/{leds{compatible="gpio-leds";led0:led_0{gpios=<&gpio02GPIO_ACTIVE_HIGH>;label="LED0";};};};

这里可以看到:

led0

就是一个 Node Label。
程序以后就是找:

led0

Button

例如:

buttons{compatible="gpio-keys";button0:button_0{gpios=<&gpio09GPIO_ACTIVE_LOW>;label="SW0";};};

Button 和 LED 都只是:

Node

Devicetree 的树结构
例如:
所以叫:

Device Tree

Node
例如:

uart0{};

就是一个 Node。

里面有很多 Property。

例如:

uart0{current-speed=&lt
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 3:30:48

STL 容器内幕:vector 的三个指针与 string 的 SSO

① 钩子&#xff1a;24 字节装下一百万个 int sizeof(std::vector<int>) 只有 24 字节&#xff0c;却能装下一百万个 int——因为它自己只存三个指针。 std::string 的短字符串"免费"、不碰堆分配&#xff1b;vector 扩容按 2 倍翻。这些"魔法"&…

作者头像 李华
网站建设 2026/9/29 3:30:48

【数据结构】拓扑排序仅逻辑删除

你的理解是对的——在 Kahn 算法中&#xff0c;确实不需要物理删除边&#xff0c;只需将邻接顶点的入度减 1 即可。下面解释为什么这样做是正确且高效的&#xff1a;1. 算法逻辑模拟的是“删除顶点及其出边”当顶点 u 被输出&#xff08;从队列取出&#xff09;时&#xff0c;它…

作者头像 李华
网站建设 2026/9/29 3:27:09

Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(二)

子文档二&#xff1a;wdi-simple —— 命令行极简安装器 wdi-simple.c 是 libwdi 提供的最简单的驱动安装示例&#xff0c;其代码行数不足 200 行&#xff0c;但却完整地展示了 libwdi 的核心工作流程。它非常适合开发者快速理解如何在自己的应用程序中集成驱动安装功能。 核心…

作者头像 李华
网站建设 2026/9/29 3:26:52

悬疑短篇创作法:以“贼手”意象撑起人物与反转

故事开篇那一刻&#xff0c;读者最先记住的往往不是案发现场&#xff0c;不是时间线&#xff0c;也不是那句冷冰冰的台词——而是一双手。题目就叫“那一双贼手”&#xff0c;我在创作同名的短篇悬疑时&#xff0c;心里装的其实不是“贼”这个身份&#xff0c;而是“手”这个器…

作者头像 李华