RT-Thread 新一代驱动框架 DM 揭秘:从设备树到动态加载,彻底告别硬编码 | 技术集结

来源:RT-Thread操作系统 RTOS 2 次阅读
摘要:在传统的 RTOS 驱动开发中,硬件资源往往靠硬编码、设备与驱动强耦合,导致移植难、复用低、维护成本高。   如今,RT-Thread 推出了新一代 DM(Device Manager)驱动框架,引入设备树(Device Tree)、自动匹配与动态 probe 机制,让驱动开发更加现代化、可扩展。   本文以 qemu-virt64-aarch64 平台为例,带你从零上手 DM 框架:   设

在传统的 RTOS 驱动开发中,硬件资源往往靠硬编码、设备与驱动强耦合,导致移植难、复用低、维护成本高。  

如今,RT-Thread 推出了新一代 DM(Device Manager)驱动框架,引入设备树(Device Tree)、自动匹配与动态 probe 机制,让驱动开发更加现代化、可扩展。  

本文以 qemu-virt64-aarch64 平台为例,带你从零上手 DM 框架:  

  • 设备树的三种使用方式  

  • 最小系统与多核启动实战  

  • 与传统驱动框架的对比

如果你是嵌入式开发者RT-Thread 爱好者,这篇文章将帮你快速掌握下一代 RT-Thread 驱动开发范式。

目录

简介

核心特点

两种驱动框架对比

DM使用方式(以qemu-virt64-aarch64为例)

1 简介

RT-Thread 新一代 DM(Device Manager)驱动框架,是近年来引入的一套现代化设备驱动管理模型。

该框架主要面向 高性能平台(MPU / SoC),通过引入类似 Linux 驱动模型的设计理念,实现:

  • 设备与驱动解耦

  • 基于设备树(Device Tree)的硬件描述

  • 自动匹配与动态加载(probe 机制)

其目标是逐步替代或并行于传统静态设备注册方式,构建更加统一、灵活、可扩展的驱动体系。

2 核心特点

  • ✅ 基于设备树描述硬件资源

  • ✅ Driver / Device 解耦

  • ✅ 自动匹配(compatible)

  • ✅ 动态 probe / remove 机制

  • ✅ 更适合复杂 SoC 平台

3 两种驱动框架对比

4 DM使用方式(以qemu-virt64-aarch64为例)

4.1 准备工作

  • 获取最新RT-Thread源码 本文档使用commit: 2b58dec87b584aa7ded6e8c736498716f8d29cd0

  • 进入BSP 目录:bsp/qemu-virt64-aarch64

  • 打开menuconfig,开启 SMART 选项

  • 下载 SMART 专用工具链,并设置 RTT_EXEC_PATH与RTT_CC_PREFIX环境变量

4.2 设备树使用方式

在 DM 框架中,设备树(Device Tree)是核心输入,用于描述硬件资源(UART、GIC、VirtIO 等)。

当前支持三种方式:

方式一:使用 QEMU 自动生成 DTB

QEMU 的 virt 平台可以自动生成设备树,并通过寄存器传递给内核。

启动命令:

qemu-system-aarch64 \

原理:

  • QEMU 在启动时动态构建 DTB

  • 将 DTB 地址通过寄存器传递

  • RT-Thread 在 early boot 阶段解析该 DTB

方式二:使用外部 DTB 文件

可以自定义 .dts 并编译为 .dtb,然后传给 QEMU:

qemu-system-aarch64 \

设备树编译方法:

dtc -I dts -O dtb -o virt.dtb virt.dts

方式三:内嵌设备树(RT-Thread 内置 DTB)

可以在 menuconfig 中配置:

RT_BUILTIN_FDT_PATH="path/to/your.dtb"

系统会通过 .incbin 将 DTB 嵌入到最终镜像中。

实现原理:

  • 编译阶段将 DTB 二进制嵌入 .rodata

  • 启动时直接使用内置 DTB,而不依赖 QEMU 传参

4.3 自定义设备树使用(最小系统示例)

本节基于一个最小可运行设备树(DTS),讲解如何在 RT-Thread DM 框架中使用自定义设备树。

4.3.1 最小设备树示例

/dts-v1/;

在上述设备树中只包含以下内容:

使用下述命令将dts编译为dtb,交由rt-thread去解析处理

dtc -I dts -O dtb -o  qemu-virt.dtb  qemu-virt.dts

使用如下命令启动QEMU:

qemu-system-aarch64 \

可以看到系统启动成功LOG:

[I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0

4.3.2 设备树多核启动示例

在之前menuconfig中可以看到,当前系统是支持 SMP的,并且qemu-virt64-aarch64默认配置#define RT_CPUS_NR 4,这里启动两个CPU作为演示

那么我们需要额外配置一下设备树,首先配置CPUS节点

cpus {

在这个CPU配置中,CPU多核启动需要通过调用 PSCI来完成,所以设备树中需要加入PSCI的节点,如下:

psci {

使用下述命令将dts编译为dtb,交由rt-thread去解析处理

dtc -I dts -O dtb -o  qemu-virt.dtb  qemu-virt.dts

使用如下命令启动QEMU:

qemu-system-aarch64 \

可以看到系统启动成功LOG:

[I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0

注:在之前所提到的,系统启动时是根据设备树来决定系统配置的,所以,即使我们定义了 #define RT_CPUS_NR 4 也还是启动了2个CPU

如果将QEMU启动时的参数 -smp 修改的比设备树中定义的多,或将 RT_CPUS_NR 修改的比设备树中定义的少,或将系统的SMP关掉会发生什么,这里建议上手验证一下

相关推荐
评论区

登录后即可参与讨论

立即登录