如何在devicetree overlay中添加常量并在代码中读取对应值?
设备树Overlay定义常量的正确方案
问题根因
你之前的配置没有为自定义节点添加compatible属性,Zephyr构建系统只会为匹配到官方/自定义绑定的节点生成devicetree相关的头文件宏定义,无绑定的节点属性不会同步到devicetree_unfixed.h等生成文件中。
正确的Overlay配置
Zephyr官方预留了zephyr,user通用兼容属性,专门用于用户自定义常量场景,无需额外编写绑定即可自动生成宏,修改后的overlay配置如下:
/ { gpio_pin_names { compatible = "zephyr,user"; led-blue = <9>; /* 可以继续添加其他自定义常量属性 */ }; };
配置生效后,zephyr.dts中会保留原有的属性值,同时自动生成对应的头文件宏。
代码中读取数值的方法
- 首先引入devicetree头文件:
#include <zephyr/devicetree.h>
- 通过DT宏读取属性值:
设备树中属性名的中划线-会自动转换为宏中的下划线_,因此led-blue属性在代码中用led_blue指代:
// 读取led-blue的数值 #define LED_BLUE_PIN DT_PROP(DT_PATH(gpio_pin_names), led_blue) // 可选:添加编译校验,确保属性存在 BUILD_ASSERT(DT_NODE_HAS_PROP(DT_PATH(gpio_pin_names), led_blue), "Device tree missing led-blue property in gpio_pin_names node");
后续代码中直接使用LED_BLUE_PIN即可拿到对应的值9。
内容的提问来源于stack exchange,提问作者SePröbläm
相关产品推荐
相关产品推荐

