Zephyr qemu_leon3 板级支持详解:在 QEMU 中构建、运行与调试 LEON3 仿真环境 📅 发布时间:2026/9/20 23:33:35 👁 浏览次数: Zephyr qemu_leon3 板级支持详解在 QEMU 中构建、运行与调试 LEON3 仿真环境【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr本文以 Zephyr 中的qemu_leon3板级配置为核心系统讲解如何在 QEMU 中仿真 Gaisler LEON3SPARC v8 兼容处理器、构建并运行 Zephyr 应用与内核测试以及该板级目录中设备树、CMake 构建钩子、Kconfig 与 defconfig 各自承担的角色。读完后你将能够独立在qemu_leon3上编译应用、通过 QEMU 引导运行、查看控制台输出并理解-machine leon3_generic、QEMU_ICOUNT_SHIFT等关键参数背后的实现依据。板级概述qemu_leon3是 Zephyr 提供的一套用于仿真 LEON3 处理器的板级配置board configuration。LEON3 是 Cobham Gaisler 推出的 SPARC v8 兼容处理器在 QEMU 中无需任何真实硬件即可运行 Zephyr 应用与内核测试。根据 board.yml该板级的核心元信息为nameqemu_leon3full_nameQEMU Emulation for LEON3vendorgaislersocsleon3而 qemu_leon3.yaml 进一步声明了构建系统的视角type: qemusimulation为qemu说明这是一个纯仿真板arch: sparc即运行在 SPARC 架构上ram: 10485761 MiB、flash: 524288512 KiBtoolchain仅列出zephyr即 Zephyr 官方交叉工具链supported特性为netiftesting默认启用default: true但ignore_tags排除了net与bluetooth两类测试——可以推断该板级支持网络接口设备模型但不作为网络/蓝牙功能测试的目标平台。目录结构与各文件职责qemu_leon3 板级目录 的组织方式是 Zephyr 板级支持的典型形态各文件分工明确文件职责board.yml板级身份声明名称、厂商、SoCboard.cmake设置仿真平台与 QEMU 命令行参数Kconfig选择QEMU_TARGET、CPU_HAS_FPUKconfig.qemu_leon3选择 SoC 配置SOC_LEON3Kconfig.defconfig板级默认内核选项qemu_leon3_defconfig预置的构建配置qemu_leon3.dts板级设备树qemu_leon3.yaml工具链、测试策略与硬件资源声明doc/index.rst官方板级文档设备树硬件模型如何定义板级设备树 qemu_leon3.dts 本身很薄它#include gaisler/leon3soc.dtsi引入 SoC 级硬件描述然后只做三件事选择控制台/Shell/内存节点、修正 timer 中断号、打开 UART。/ { chosen { zephyr,console uart0; zephyr,shell-uart uart0; zephyr,sram ram0; }; }; timer0 { interrupts 6; }; uart0 { interrupts 3; status okay; }; ram0 { reg 0x40000000 0x40000000; };被包含的 leon3soc.dtsi 定义了完整的 SoC 硬件模型CPUcpu0: cpu0compatible gaisler,leon3单核reg 0内存ram0: memory40000000compatible mmio-sram起始地址0x40000000、大小0x40000000板级 DTS 中chosen将其指定为zephyr,sram即 Zephyr 镜像的运行内存区SoC 总线soc节点使用compatible gaisler,leon3-soc, simple-bus中断父节点为irqmp中断控制器irqmp080000200compatible gaisler,irqmp并声明eirq 0SPARC 异常向量入口的中断映射通用定时器timer0: gptimer80000300compatible gaisler,gptimerDTSI 中默认为中断号 8板级 DTS 将其覆写为interrupts 6与 QEMUleon3_generic机型的实际中断接线保持一致串口uart0: apbuart80000100compatible gaisler,apbuartDTSI 中默认status disabled由板级 DTS 置为okay并把中断号设为 3。从设备树结构看LEON3 SoC 的内存映射非常简洁外设挂在0x80000000基址UART0x80000100、IRQMP0x80000200、GPTIMER0x80000300SRAM 位于0x40000000与 QEMU 中leon3_generic机型的实现一一对应。构建系统集成board.cmake 与 Kconfigboard.cmake 是 QEMU 类板级支持的关键文件set(SUPPORTED_EMU_PLATFORMS qemu) set(QEMU_CPU_TYPE leon3) # This board used to pass -icount auto here, where it was silently overridden # by the CONFIG_QEMU_ICOUNT_SHIFT derived value. Honouring it instead fails the # kernel timer and scheduler tests, so the derived value is the one this board # wants; the flag was dead and is dropped rather than moved to # QEMU_ICOUNT_OVERRIDE. set(QEMU_BOARD_FLAGS -machine leon3_generic -m 1G ) include(${ZEPHYR_BASE}/boards/common/qemu.board.cmake)要点解析SUPPORTED_EMU_PLATFORMS qemu声明该板仅由 QEMU 仿真运行QEMU_CPU_TYPE leon3告知构建系统以 LEON3 作为 QEMU 目标 CPU 类型QEMU_BOARD_FLAGS附加 QEMU 命令行参数。-machine leon3_generic选择 QEMU 提供的 LEON3 通用机型-m 1G为 QEMU 预留 1 GiB 内存供内存映射使用实际可用 RAM 由设备树的ram0决定注释明确记录了一段维护历史曾传入-icount auto但它会被CONFIG_QEMU_ICOUNT_SHIFT推导出的参数静默覆盖若真正启用-icount auto内核定时器与调度器测试会失败因此该死参数被移除而非挪到QEMU_ICOUNT_OVERRIDE。这说明该板刻意不使用 QEMU 的虚拟指令计数时钟而是依赖 defconfig 中的固定时基见下文末尾include()公共文件 qemu.board.cmake其内容只有三行board_set_flasher_ifnset(qemu) board_set_debugger_ifnset(qemu) board_finalize_runner_args(qemu)即当用户未显式指定时把 flasher 与 debugger 都设为qemu并汇总 QEMU 运行参数。这也对应官方文档中supported runners的含义——该板没有独立的编程器/调试器 runner全部通过 QEMU 完成。Kconfig 侧的接线同样简洁KconfigBOARD_QEMU_LEON3选择QEMU_TARGET与CPU_HAS_FPU。前者把构建拉入 QEMU 通用目标支持路径后者表明 LEON3 具备浮点单元编译器可以安全地使用 FPU 指令Kconfig.qemu_leon3BOARD_QEMU_LEON3选择SOC_LEON3从而挂载 soc 目录 下的 LEON3 SoC 实现启动代码、异常处理等Kconfig.defconfig在板级启用时将UART_INTERRUPT_DRIVEN的默认值设为y使控制台默认走中断驱动的 UART 收发而非轮询。默认配置defconfigqemu_leon3_defconfig 预置了五个选项CONFIG_CONSOLEy CONFIG_SERIALy CONFIG_UART_CONSOLEy CONFIG_EXTRA_EXCEPTION_INFOy CONFIG_QEMU_ICOUNT_SHIFT6CONFIG_CONSOLEyCONFIG_SERIALyCONFIG_UART_CONSOLEy启用控制台子系统并由 UART 承载与设备树中zephyr,console uart0的选择配套CONFIG_EXTRA_EXCEPTION_INFOy异常/中断故障时输出更详细的信息便于在无真实硬件可查的仿真环境中排错CONFIG_QEMU_ICOUNT_SHIFT6这是 QEMU-icount shiftN参数的内核侧推导值含义是每执行 2^6 条虚拟指令推进虚拟时钟一拍。结合 board.cmake 的注释可知这个固定移位值是 LEON3 板上定时器与调度器测试通过的必要前提属于该板有意为之的时基策略。构建与运行由于qemu_leon3是仿真板无法真正烧录flash。官方文档给出的使用方式是以常规仿真板的方式构建并在 QEMU 中直接运行。以 synchronization 示例 为例$ west build -b qemu_leon3 samples/synchronization $ west runwest run会完成三件事构建镜像、以-machine leon3_generic -m 1G ...等参数启动 QEMU 引导镜像、把虚拟串口接到终端。控制台输出形如*** Booting Zephyr OS build zephyr-v2.4.0-27-g7b37fdd5303b *** threadA: Hello World from qemu_leon3! threadB: Hello World from qemu_leon3! threadA: Hello World from qemu_leon3! threadB: Hello World from qemu_leon3! threadA: Hello World from qemu_leon3! threadB: Hello World from qemu_leon3! threadA: Hello World from qemu_leon3! threadB: Hello World from qemu_leon3! threadA: Hello World from qemu_leon3! threadB: Hello World from qemu_leon3!可以看到两个线程threadA/threadB交替打印印证了调度器在 LEON3 仿真环境中的正常工作。运行结束后按CTRLA再按x退出 QEMU这是 QEMU 多鼠标模式下的标准退出键序。由于 flasher 被 boards/common/qemu.board.cmake 设为qemu也可以单独使用west flash触发同一套 QEMU 引导流程调试GDB则走qemudebugger runner具体流程参见 Zephyr 应用调试application debugging相关文档。测试策略与适用边界从 qemu_leon3.yaml 的testing段可以看到default: true该板默认参与 Zephyr 内核/子系统的默认测试矩阵适合在没有 SPARC 实板时验证内核行为ignore_tags: [net, bluetooth]网络栈测试与蓝牙测试被显式排除。虽然板级声明supported: netif设备模型层面存在网络接口但当前不作为网络功能测试目标资源声明ram: 1048576 / flash: 524288表明测试构建按 1 MiB RAM / 512 KiB flash 的预算裁剪。适用前提小结需要安装 QEMU其leon3_generic机型可用、Zephyr 官方 SPARC 交叉工具链toolchain: [zephyr]以及标准的 Zephyr 构建环境west CMake Ninja。小结qemu_leon3板级支持麻雀虽小五脏俱全设备树qemu_leon3.dts leon3soc.dtsi定义了 IRQMP/GPTIMER/APBUART 的最小 SoC 模型board.cmake 通过-machine leon3_generic与固定的QEMU_ICOUNT_SHIFT6时基策略保证内核定时器/调度器测试的稳定性Kconfig 选择QEMU_TARGET、CPU_HAS_FPU与SOC_LEON3defconfig 则以 UART 中断驱动控制台为基础输出通道。掌握这套结构后你可以以完全相同的方式理解 Zephyr 中其他 QEMU 仿真板如各 RISC-V、ARM Cortex-M 机型的配置组织也可以在此基础上快速搭建自己的 SPARC 仿真验证环境。【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考