- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
导读
本文围绕 Zephyr 仓库中的qemu_cortex_r5板级配置(对应文档 boards/qemu/cortex_r5/doc/index.rst)展开,讲解如何借助 QEMU 模拟 Xilinx Zynq UltraScale+(ZynqMP)平台上的 ARM Cortex-R5 CPU,在无实体硬件的情况下构建、运行和调试 Zephyr 应用与内核测试。读完本文,你将掌握该板级配置支持的硬件外设、内核配置要点、已知限制,以及从源码构建到 QEMU 启动运行的标准操作流程。
板级配置概述
qemu_cortex_r5是一个 type 为qemu的板级配置(见 qemu_cortex_r5.yaml),其核心思路是用 QEMU 模拟 ZynqMP 平台,让开发者无需 ZCU102 等真实开发板即可体验 Zephyr 在 ARM Cortex-R5 上的运行效果。
该配置对真实硬件持非常谨慎的态度:文档明确声明,"该板级配置不保证适用于真实的 ZCU102 硬件系统或任何其他硬件系统"(见 index.rst)。因此它定位为纯软件仿真/验证环境,而不是面向真实板卡的移植代码。
该配置支持以下设备:
- ARM PL-390 通用中断控制器(GIC)
- Xilinx Zynq TTC(Cadence TTC)定时器
- Xilinx Zynq UART 串口
从设备树看,GIC 位于 dts/arm/xilinx/zynqmp_rpu.dtsi 中interrupt-controller@f9000000,其compatible为"arm,gic-v1", "arm,gic";UART 与 TTC 则定义在 dts/arm/xilinx/zynqmp.dtsi 中,分别为uart@ff000000(compatible = "xlnx,xuartps")和timer@ff110000(compatible = "xlnx,ttcps")。
硬件视角:QEMU 模拟了什么
CPU 与平台模型
qemu_cortex_r5通过 QEMU 的arm-generic-fdt机器模型加固定设备树二进制(DTB)的方式来描述硬件。相关启动参数定义在 board.cmake 中:
- 仿真平台:
qemu,QEMU 二进制后缀为xilinx-aarch64 - CPU 类型:
cortex-r5(QEMU_CPU_TYPE) - 机器参数:
-machine arm-generic-fdt,并加载本板目录下的fdt-single_arch-zcu102-arm.dtb - 内核加载参数:通过
loader设备把 Zephyr ELF 镜像加载到cpu-num=4(即 RPU 集群中的 R5 核心),并附带两条写寄存器/内存的启动辅助指令
设备树中,CPU 节点cpu@0的compatible为"arm,cortex-r5f"(见 zynqmp_rpu.dtsi),说明该配置面向的是带浮点单元的 Cortex-R5F 模型。
内存与存储
板级设备树 qemu_cortex_r5.dts 中定义了:
- SRAM:
memory@4000000,64 MiB(DT_SIZE_M(64)),被chosen节点选为zephyr,sram; - Flash:
zephyr,flash指向flash0; - OCM:
zephyr,ocm指向ocm(256 KiB 片上内存,见 zynqmp.dtsi); - QSPI:
qspi节点下挂载了两颗jedec,spi-nor兼容的串行 NOR Flash,各 512 MiB(size = <0x20000000>),并带完整的 SFDP 参数。
板级 YAML 中记录的 RAM 大小为 65536 KiB、Flash 为 32768 KiB(见 qemu_cortex_r5.yaml)。
支持的特性与外设配置
系统定时器
文档说明该系统定时器 tick 频率为 1000 Hz。当前仓库中的 qemu_cortex_r5_defconfig 将CONFIG_SYS_CLOCK_TICKS_PER_SEC配置为100(该值会随版本演进调整,请以你所检出版本的 defconfig 为准)。定时器硬件为 Xilinx Zynq TTC(Cadence TTC),在设备树中ttc0被使能(status = "okay"),时钟频率为 5 MHz(见 qemu_cortex_r5.dts)。
串口
该板配置使用单一串行通信通道,即片上UART0。在设备树中uart0被使能,波特率current-speed为 115200,时钟频率为 99999901 Hz(见 qemu_cortex_r5.dts)。同时chosen节点将zephyr,console与zephyr,shell-uart都指向uart0,因此控制台输出与 shell 共用这一路串口。
对应的 defconfig 启用了串口与控制台支持:
CONFIG_SERIAL=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y内核与内存相关配置
板级 defconfig 中还包含以下关键项:
| 配置项 | 取值 | 说明 |
|---|---|---|
CONFIG_XIP | n | 关闭原地执行(XIP),镜像从 RAM 加载运行 |
CONFIG_QEMU_ICOUNT_SHIFT | 3 | QEMU 指令计数粒度,用于保证定时器/调度在仿真下的确定性 |
CONFIG_THREAD_STACK_INFO | y | 启用线程栈信息统计 |
CONFIG_SYS_CLOCK_TICKS_PER_SEC | 100 | 系统时钟每秒 tick 数 |
CONFIG_ARM_MPU | y | 启用 ARM MPU(内存保护单元) |
此外,Kconfig.defconfig 还针对该板做了一些约束性调整:默认不生成.bin输出(BUILD_OUTPUT_BIN=n);在开启USERSPACE时禁用COMPILER_ISA_THUMB2(Cortex-R5 不依赖 Thumb-2 用户空间);当启用SPI_NOR时,SFDP 解析默认走设备树(SPI_NOR_SFDP_DEVICETREE);并将ISR_STACK_SIZE默认设为 512 字节。
SOC 选择
该板通过 Kconfig.qemu_cortex_r5 中的select SOC_XILINX_ZYNQMP_RPU将 SOC 指定为 Xilinx ZynqMP 的 RPU(Real-Time Processing Unit)子集,并在 Kconfig 中select QEMU_TARGET标记其为 QEMU 目标板。
已知问题与限制
文档明确列出了以下未支持的平台特性:
- 双冗余核锁步(DCLS)执行不被模拟:真实 ZynqMP RPU 的锁步冗余运行模式在 QEMU 中不存在,因此无法验证与该特性相关的行为;
- Xilinx Zynq TTC 驱动不支持 tickless(无节拍)模式:系统必须依赖周期性 tick 运转,不能进入完全 tickless 的空闲模式。
此外,板级 YAML 中testing.ignore_tags列出了net与bluetooth,表示 twister 等测试框架默认会跳过涉及网络与蓝牙的测试用例(见 qemu_cortex_r5.yaml),这从侧面反映了该仿真平台在外设覆盖上的边界。
编程与调试:在 QEMU 中运行同步示例
该配置的主要用途是"在 QEMU 模拟环境中运行基础的 Zephyr 应用与内核测试"。以 Zephyr 自带的synchronization示例为例,在 Unix 类主机上执行:
west build -b qemu_cortex_r5 samples/synchronization west build -t run第一条命令以qemu_cortex_r5为目标板构建 samples/synchronization 示例镜像;第二条命令启动 QEMU 引导该镜像。启动后控制台将输出类似如下的内容(示例源码见 samples/synchronization/src/main.c):
*** Booting Zephyr OS build v2.2.0 *** threadA: Hello World from qemu_cortex_r5! threadB: Hello World from qemu_cortex_r5! threadA: Hello World from qemu_cortex_r5! threadB: Hello World from qemu_cortex_r5! threadA: Hello World from qemu_cortex_r5! threadB: Hello World from qemu_cortex_r5! threadA: Hello World from qemu_cortex_r5! threadB: Hello World from qemu_cortex_r5! threadA: Hello World from qemu_cortex_r5! threadB: Hello World from qemu_cortex_r5!注:上述输出中的构建版本号来自文档编写时的快照,实际输出会随你检出的 Zephyr 版本而变化;线程 A/B 交替打印的节奏由示例中的信号量与调度逻辑决定。
退出 QEMU 的方式为:先按CTRL+A,再按x。
调试
如需对运行在 QEMU 中的镜像进行调试,可参考 Zephyr 应用调试的详细指南(文档位置见 doc/develop/application/index.rst 中"Application Development"相关章节,也可直接在仓库中检索application_debugging标签对应的文档 doc/develop/application/application_debugging.rst)。由于board.cmake已声明SUPPORTED_EMU_PLATFORMS qemu,你同样可以借助west build -t debug或qemu运行器机制接入 GDB 进行断点调试。
参考资料
文档末尾给出了三份与平台相关的官方手册,可作为深入理解该板级配置硬件模型的依据:
- ARMv7-A 与 ARMv7-R 架构参考手册(ARM DDI 0406C ID051414)——Cortex-R5 属于 ARMv7-R 架构;
- Cortex-R5 与 Cortex-R5F 技术参考手册(ARM DDI 0460C ID021511)——对应设备树中的
arm,cortex-r5fCPU; - Zynq UltraScale+ 器件技术参考手册(UG1085)——对应被模拟的 ZynqMP 平台。
小结
qemu_cortex_r5是 Zephyr 中一个典型的"纯 QEMU 仿真"板级配置:通过arm-generic-fdt机器模型加 ZynqMP 设备树,在桌面环境里还原出一台带 GIC、TTC 定时器与 UART 的 Cortex-R5 虚拟机。它特别适合以下场景:在内核开发/测试阶段快速验证同步、调度等基础机制;在没有 ZCU102 硬件时先行跑通应用逻辑;以及借助 QEMU 的确定性与调试能力定位内核问题。使用时请始终牢记其仿真边界——DCLS、tickless 以及网络/蓝牙等外设均不在支持范围内,涉及这些特性的验证仍需依赖真实硬件平台。
- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
相关推荐
Zephyr 在 QEMU 上模拟 Raspberry Pi 4B:qemu_cortex_a72 板级配置与 Cortex-A72 开发实战
Zephyr 在 QEMU 上模拟 Raspberry Pi 4B:qemu_cortex_a72 板级配置与 Cortex A72 开发实战 导读 qemu_
操作系统嵌入式RTOS物联网Zephyr 在 QEMU 上模拟 ARM Cortex-M3:qemu_cortex_m3 板级配置完整指南
Zephyr 在 QEMU 上模拟 ARM Cortex M3:qemu_cortex_m3 板级配置完整指南 导读 本文围绕 Zephyr RTOS 仓库中的
操作系统嵌入式RTOS物联网Zephyr 在 QEMU 上运行 ARM Cortex-A53:qemu_cortex_a53 开发板配置与实战指南
Zephyr 在 QEMU 上运行 ARM Cortex A53:qemu_cortex_a53 开发板配置与实战指南 导读 本文以 Zephyr RTOS 仓
操作系统嵌入式RTOS物联网
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考