You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zephyr RTOS(STM32)自定义节点编译报错:undefined reference to `__device_dts_ord_17`

问题描述

在另一台PC上可正常运行的Zephyr代码,当前PC执行zephyr build编译时出错。代码片段:

const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(mygpio));
if (!device_is_ready(dev)) {
    printk("unready");
}

报错信息:undefined reference to __device_dts_ord_17'`

已完成的配置:

  • 在nucleo_f334r8.overlay中添加了自定义mygpio节点
  • prj.conf中开启了相关外设配置
  • 在dts/bindings下定义了对应设备绑定文件
  • 编译后build/zephyr.dts和devicetree_generated.h中已生成序号为17的mygpio节点,但zephyr.map中无__device_dts_ord_17的引用
  • 默认外设(如gpioa)可正常使用
  • 已查阅官方故障排查文档但未解决
可能的解决方案
  • 检查驱动代码的设备注册宏
    确保对应驱动中使用了DEVICE_DT_INST_DEFINE()或DEVICE_DT_DEFINE()宏来注册设备,且宏中的设备序号(或节点路径)与mygpio节点的dts序号匹配。如果驱动注册宏未正确关联该节点,不会生成__device_dts_ord_17符号。

  • 验证绑定文件与overlay节点的compatible匹配
    确认nucleo_f334r8.overlay中mygpio节点的compatible属性值,和dts/bindings下绑定文件的compatible字段完全一致(大小写、字符均不能出错)。两者不匹配时,Zephyr无法将节点关联到对应驱动,也就不会生成设备符号。

  • 检查overlay节点的status属性
    确保mygpio节点的status属性设置为"okay",如果是"disabled"或未设置,Zephyr会跳过该节点的设备实例化,不会生成对应的设备符号。

  • 彻底清理build目录后重新编译
    执行west build -t clean清理旧编译产物,再重新执行west build。旧缓存文件可能导致dts节点与驱动的关联未更新,清理后重新编译可解决这类缓存问题。

  • 确认Kconfig配置是否真正生效
    检查build/zephyr/.config文件,确认相关驱动启用配置(比如CONFIG_GPIO或自定义驱动的Kconfig选项)已被正确设置为y或m。若配置未生效,驱动不会被编译进固件,自然不会生成对应的设备符号。

  • 对比两台PC的Zephyr版本
    查看两台PC上的Zephyr版本(west zephyr-export --version),若版本不一致,可能存在dts处理或设备注册的语法差异。尝试将当前PC的Zephyr版本切换到另一台PC的版本再编译测试。

内容的提问来源于stack exchange,提问作者Jokubas11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:25:04