2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第4篇技术报告,题目为:
“Zephyr中系统设备树支持”

Marti Bolivar
Marti是Nordic半导体的高级软件工程师,是Zephyr的长期开发者,也是设备树子系统的共同维护者。
Zephyr对AMP SoCs的支持是有效的,但由于在以下层面上硬件支持功能的不足而存在一些众所周知的可用性问题:- 设备树 - 硬件模型 - 构建系统。本文将介绍系统设备树规范及其在解决这些问题中的作用。系统设备树是标准设备树规范的扩展。它对基本规范的主要扩展是允许在异构SoC中同时表示多个CPU集群,包括它们各自的内存映射、不同可执行映像的内存分区和外设分配。本文的主要目标是定义正在解决的问题,解释为什么我们当前的构建系统不足以解决这些问题,并讨论系统设备树可以发挥作用的领域。我们还将介绍在Zephyr构建系统中支持系统设备树的当前工作的状况。
Zephyr构建过程可以分为两个主要阶段:配置阶段(由CMake驱动)和构建阶段(由Make或Ninja驱动)。其中配置阶段从调用CMake生成构建系统、指定源应用程序目录和板型目标开始。*.dts(设备树源)和*.dtsi(设备树源包含)文件影响了“几乎一切”配置选项:
Soc硬件描述/配置
系统时钟
默认驱动程序选择
设备实例化
应用硬件描述/配置
等等
- v8-M中的内存寻址:安全状态下的外设地址变化
- 不同构建系统中的重复静态内存分配
- 共享的IPC资源对于协处理器来说也很麻烦
系统设备树(System Devicetree)是设备树规范的一种扩展,旨在解决在复杂系统中配置和管理硬件资源的问题。有以下几个特点:
设备树规范的向后兼容扩展
在开放环境中开发
定期与设备树规范/Linux设备树维护者会面
规范由设备树组织托管
https://github.com/devicetree-org/lopper/tree/master/specification
系统设备树通过使用层次结构和节点来表示系统中的各个组件和设备之间的关系。每个节点描述了一个设备或组件,并包含有关其硬件、寄存器、中断、时钟等属性的信息。系统设备树提供了一种统一的方式来描述和配置系统中的所有设备和资源。
/cpus节点:“/cpus”节点通常表示系统中所有的处理器核心。每个子节点代表一个CPU核心,包含了描述该核心的属性,例如其运行频率等。
独立的CPU集群:在一些高性能系统中,处理器核心会被组织成集群,每个集群包含一组核心,它们共享某些资源,例如缓存。每个集群可以在设备树中作为一个独立的节点表示。
全局“simple-bus”节点:“simple-bus”是一种设备树节点类型,它表示一种简单总线架构,可以连接多种设备。在”simple-bus”节点下的设备节点,代表了连接到这个总线上的所有设备。
独立的“indirect-bus”节点:“indirect-bus”是另一种设备树节点类型,它表示一种间接总线架构。与”simple-bus”不同,“indirect-bus”可以表示更复杂的总线结构,例如PCI总线。
独立的“执行域”(Independent execution domain):在一些情况下,可能需要将系统的执行环境分隔成多个独立的执行域,每个执行域都有自己的资源和权限。在设备树中,每个执行域会被表示为一个独立的节点。
转换为单独的标准设备树(Transformed into separate standard devicetree):系统设备树在Zephyr中的使用方式是将其转换为独立的标准设备树格式,以便与其他系统和工具进行兼容。这种转换可以通过工具或脚本自动完成,并且可以用于配置和启动系统。
Sysbuild是一个更高级的构建系统,可以将多个其他构建系统组合在一起使用。它是一个更高级的层次,将一个或多个Zephyr构建系统和可选的其他构建系统组合成一个分层的构建系统。例如,你可以使用sysbuild将Zephyr应用程序与MCUboot引导加载程序一起构建,并将它们都烧录到设备上,并进行调试。
Sysbuild通过配置和构建至少一个Zephyr应用程序,并可选择地构建多个其他项目。这些额外的项目可以是Zephyr应用程序或其他类型的构建项目,根据你的需要进行运行。与Zephyr的构建系统类似,sysbuild也是CMake编写并使用Kconfig。