Zephyr RTOS 设备树(Device Tree)基础
一个让我熬夜到凌晨三点的bug
去年做一款工业网关,用的是NXP i.MX RT1062,Zephyr 2.7。板子焊好,固件烧进去,串口死活不输出。示波器量TX引脚,有波形,但就是没数据。折腾了四个小时,最后发现是设备树里UART的pinctrl节点配错了——我把TX的pad配置写成了GPIO模式。
那晚之后我决定,必须把设备树这玩意儿彻底搞明白。今天这篇笔记,就是那次踩坑的产物。
设备树到底是个啥
简单说,设备树就是一块板子的“硬件说明书”。它告诉Zephyr内核:CPU是什么型号、外设挂在哪条总线上、中断号是多少、GPIO复用成什么功能。
Zephyr里设备树文件后缀是.dts(Device Tree Source),编译后会生成.dtsi(包含文件)和.dtb(二进制)。但Zephyr跟Linux不一样,它不直接加载dtb,而是在编译阶段就把设备树信息解析成C结构体,直接编译进固件。
这个设计有个好处:运行时不需要解析dtb,省内存省时间。坏处是:改硬件配置必须重新编译整个固件。
设备树文件结构速览
拿我手头一个STM32F407的项目举例,设备树长这样:
/dts-v1/; #include <st/f4/stm32f407.dtsi> / {