新闻详情

新闻详情

首页 / 资讯中心 / 详情

Zephyr BSP: 19-手撕 struct device 的生成

发布时间:2026/9/29 6:38:09来源:尧图网络
Zephyr BSP: 19-手撕 struct device 的生成
摘要:本文深入剖析 Zephyr 设备模型的核心机制,完整追踪一个 Devicetree 节点从DEVICE_DT_DEFINE()宏展开,到最终生成 ELF 中struct device对象的全过程。文章从struct device的四个核心成员(config、data、api、state)入手,逐步拆解DEVICE_DT_DEFINE()的宏调用链,阐明 Device Symbol、Config/Data/API 分离设计、Init Entry、Dependency Handle 等关键概念,并厘清dependency ordinal与init priority的本质区别。最后通过简化版手撕示例和 ELF 符号验证,帮助读者建立从源码到固件的完整认知,为将公司 SoC 接入 Zephyr 打下坚实基础。从 DEVICE_DT_DEFINE() 手撕 struct device 的生成TL;DR(太长不看版)DEVICE_DT_DEFINE()是设备对象生成器,不是简单的struct device初始化,它向下调用DEVICE_DT_DEINIT_DEFINE()→Z_DEVICE_DEFINE(),最终生成 Device Object、Config、Data、API 和 Init Entry 五个部分。(见第三、四、十七节)DEVICE_DT_GET()在编译期解析为__device_dts_ord_xx,通过 Devicetree 宏直接取符号地址,不是运行时搜索设备。(见第七、八节)Config / Data / API 三者分离:config 是静态硬件配置(ROM/RO),data 是运行时状态(RAM),api 是驱动操作接口(RO),struct device只是持有这三个指针的中心节点。(见第九~十三节)Init Entry 与 Dependency Handles 是两条隐藏链:Init Entry 把初始化函数按 level + priority 放进 linker section,由 boot 阶段统一执行;Dependency Handles 记录设备间的依赖关系,用于设备排序与访问控制。(见十四~二十节)dependency ordinal≠init priority:前者回答"设备在依赖图中的身份编号",后者回答"初始化阶段何时执行",两者最终在设备初始化系统中汇合。(见二十一节)这一篇我们不再停留在:“Zephyr 有一个 struct device。”而是直接回答:一个 DTS 节点,究竟是如何一步一步变成最终 ELF 里的 struct device 对象的?核心目标是把这条链彻底打通:DTS │ ▼ DT_NODELABEL(uart0)│ ▼ DEVICE_DT_DEFINE(...)│ ▼ DEVICE_DT_DEINIT_DEFINE(...)│ ▼ Z_DEVICE_DEFINE(...)│ ├── struct device ├── device_config ├── device_data ├── driver API ├── init entry └── dependency handles │ ▼ 最终 ELF │ ▼\__device_dts_ord_xx │ ▼ struct device *一、先看最终目标:我们到底想生成什么?假设 Devicetree:usart1{status="okay";current-speed=115200;};然后 driver 中写:DEVICE_DT_DEFINE(DT_NODELABEL(usart1),uart_stm32_init,NULL,uart_data,uart_config,PRE_KERNEL_1,CONFIG_SERIAL_INIT_PRIORITY,uart_driver_api);最终我们希望得到一个类似这样的对象:structdevice__device_dts_ord_XX={.name="usart1",.config=uart_config,.api=uart_driver_api,.data=uart_data,.state=...,};但这里有一个非常重要的认知:你在源码中通常不会直接看到这样一个完整的 struct device 初始化器。因为 Zephyr 用了大量宏,把它拆成多个编译期对象。二、先回顾 struct deviceZephyr 的设备模型核心就是:struct device概念上可以简化成:structdevice{constchar*name;constvoid*config;constvoid*api;void*data;structdevice_state*state;};不同 Zephyr 版本的具体字段可能有所变化,所以这里重点不是字段数量,而是理解:struct device │ ├── config │ ├── data │ ├── api │ └── state其中:config硬件的静态配置:structuart_stm32_config{uintptr_tbase;...};通常放在只读区域。data运行时数据:structuart_stm32_data{...};通常位于 RAM。apidriver 对外暴露的操作:staticconststructuart_driver_apiuart_driver_api={.poll_in=...,.poll_out=...,...};stateZephyr 自己管理的 device state。例如:device initialized device initialization failed device power state三、真正关键的宏现在进入核心。你看到:DEVICE_DT_DEFINE(...)不要把它理解成:struct device xxx;而应该把它理解成:一个"设备对象生成器"。四、第一层:DEVICE_DT_DEFINE()概念上可以理解成:#define DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, prio, api, ...)它实际上会继续向下调用更底层的宏。典型结构可以抽象成:DEVICE_DT_DEFINE()│ ▼ DEVICE_DT_DEINIT_DEFINE()│ ▼ Z_DEVICE_DEFINE()│ ├──────────────┐ ▼ ▼ struct device dependency handles注意:真正值得研究的是 Z_DEVICE_DEFINE()。五、为什么不能直接写 struct device?假设我们自己写:
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【Codex智慧中医系统】校验时间有效期并处理过期数据 2026/9/29 7:37:22

【Codex智慧中医系统】校验时间有效期并处理过期数据

后台接口如果依赖发送时间判断数据是否有效,最容易出错的地方不是业务分支,而是时间解析、时间戳换算和异常处理。一旦校验逻辑失真,过期记录可能继续生效,有效记录也可能被误判失败。 本文围绕 TimeTools.py 中的有效期校验链路重写设计说明,读完后可以独立检查 send_ti…

阅读更多 →
【Codex智慧中医系统】封装请求工具与分页处理逻辑 2026/9/29 7:37:22

【Codex智慧中医系统】封装请求工具与分页处理逻辑

前后端分离项目中,请求工具层一旦缺少统一约束,页面可能只看到空数据或无提示失败,却难以判断是参数拼接、认证令牌、接口异常还是分页计算出了问题。 本文围绕 apps/utils/RequestTools.py 重新梳理请求封装与分页逻辑。读完后,可以独立检查接口调用、JWT 携带、写入反馈…

阅读更多 →
TensorFlow-gpu 1.x 与 2.x 版本共存配置方法 2026/9/29 7:37:22

TensorFlow-gpu 1.x 与 2.x 版本共存配置方法

在深度学习的实际开发中,有时需要在同一台 Windows 10 设备上同时使用不同版本的 TensorFlow,例如 TensorFlow 1.13.1(用于旧项目)和 TensorFlow 2.0.0(用于新项目)。由于不同版本的 TensorFlow 依赖于不同…

阅读更多 →
Windows 系统中 MySQL 5.7 的安装与卸载 2026/9/29 7:37:22

Windows 系统中 MySQL 5.7 的安装与卸载

MySQL 是最受欢迎的关系型数据库管理系统之一,被广泛用于 Web 开发、数据存储和企业应用。本指南详细介绍了 MySQL 的下载、安装、卸载及配置,同时还涵盖了 MySQL WorkBench 的使用,帮助用户在 Windows 系统上顺利搭建 MySQL 数据库环境。 无…

阅读更多 →
Linux离线安装vim全攻略:yum与apt依赖打包及本地源搭建 2026/9/29 7:37:16

Linux离线安装vim全攻略:yum与apt依赖打包及本地源搭建

1. 核心逻辑:为什么需要离线安装,以及什么场景才值得折腾先说结论:搞离线安装,绝大多数时候不是技术问题,而是环境问题。你在开发机上一条yum install -y vim敲下去,秒装完,根本轮不到搞什么离线…

阅读更多 →
【Codex智慧中医系统】统一前端模板继承与渲染方式 2026/9/29 7:37:16

【Codex智慧中医系统】统一前端模板继承与渲染方式

智慧中医系统接入现成 Web 前端模板时,最容易出问题的不是单个页面,而是静态资源、模板继承块、链接参数和后端数据字段之间没有统一口径,最终表现为样式丢失、跳转失败或页面空白。 读完本文后,可以独立检查 Django 模板体系中的 base 模板、继承页面、链接参数、数据遍历…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉