Zephyr 在 Arm MPS3 平台上的开发指南:Corstone-300/Corstone-310 与 AN536 的构建、烧录与仿真
【免费下载链接】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 RTOS 官方仓库中boards/arm/mps3的板级支持文档展开,系统讲解在 Arm MPS3 FPGA 原型验证板与 Corstone 系列 Fixed Virtual Platform(FVP)上开发 Zephyr 应用的完整流程。你将掌握mps3/corstone300/*、mps3/corstone310/*、mps3/an536/*各板级目标(BOARD qualifier)的适用场景、Secure/Non-Secure 固件构建差异、FPGA 通过 Micro SD 卡上传固件的方法,以及如何借助 QEMU 与 FVP 在无硬件的情况下完成开发验证。
MPS3 平台概览
MPS3(Arm MPS3 FPGA Prototyping Board)板卡配置由 Zephyr 官方仓库的 boards/arm/mps3 目录提供,被 Zephyr 应用用于运行在 MPS3 硬件上。它同时支持多种 Arm FPGA 镜像(FPGA image)与仿真模型:
- AN536支持 Arm Cortex-R52 CPU(Cortex-R52x2 双核子系统示例)
- AN547 与 AN552支持 Arm Cortex-M55 CPU(SSE-300 子系统 Soft Macro Model,SMM)
- AN555支持 Arm Cortex-M85 CPU(SSE-310 子系统)
- Corstone-300 与 Corstone-310 FVP(Fixed Virtual Platform,固定虚拟平台)支持所选的 Cortex-M 配置
根据所选板级目标的不同,Zephyr 提供以下设备支持:
- Nested Vectored Interrupt Controller(NVIC)
- System Tick System Clock(SYSTICK)
- Generic Interrupt Controller v3(GICv3,用于 AN536)
- Arm architectural timer(架构定时器)
- Cortex-M System Design Kit GPIO(CMSDK GPIO)
- Cortex-M System Design Kit UART(CMSDK UART)
- Ethos-U55 NPU(神经网络处理单元)
Corstone-300 / Corstone-310 FVP 是对 Arm 系统的完整仿真,包括处理器、内存与外围设备,免费提供给 Linux 与 Windows 主机使用。Zephyr 选择 FVP 作为仿真手段,是因为它能访问 Ethos-U55 NPU——这是 QEMU 或其他仿真平台不具备的能力。而 AN536 的 Cortex-R52x2 子系统则可以通过 QEMU 的mps3-an536机器支持。
板级目标(BOARD options)总览
Zephyr 为 MPS3 提供了多个 board 目标,其中corstone300、corstone310系列均区分Secure(安全态)与Non-Secure(非安全态)固件。board.yml中socs的层级结构印证了这一点:corstone300之下有an547、an552、fvp三个变体,且各自再派生ns变体;corstone310之下有an555、fvp及对应ns变体;an536则为独立 SoC 条目,见 boards/arm/mps3/board.yml。
MPS3 Corstone-300(AN547)
MPS3+ AN547 是 Cortex-M55 架构 SoC,Zephyr 同时支持构建 Secure 与 Non-Secure 固件:
| BOARD | 说明 |
|---|---|
mps3/corstone300/an547 | 构建 Secure(或仅 Secure)固件 |
mps3/corstone300/an547/ns | 构建 Non-Secure 固件 |
- FPGA 用法:按照本文「编程与调试」章节的构建与烧录步骤执行。
- FVP 用法:该变体不支持 FVP。
- QEMU 用法:若希望用 QEMU 替代默认仿真器,可在构建时通过
-DEMU_PLATFORM=qemu覆盖仿真平台选择:
$ west build -b mps3/corstone300/an547 samples/hello_world -DEMU_PLATFORM=qemu -t runMPS3 Corstone-300(AN552)
MPS3+ AN552 同样是 Cortex-M55 架构 SoC,支持 Secure 与 Non-Secure 固件构建:
| BOARD | 说明 |
|---|---|
mps3/corstone300/an552 | 构建 Secure(或仅 Secure)固件 |
mps3/corstone300/an552/ns | 构建 Non-Secure 固件 |
- FPGA 用法:按「编程与调试」章节执行。
- FVP 用法:该变体不支持 FVP。
- QEMU 用法:该板级变体不支持 QEMU。
MPS3 Corstone-300(FVP)
MPS3+ FVP 是 Cortex-M55 架构的仿真模型,支持 Secure 与 Non-Secure 固件构建:
| BOARD | 说明 |
|---|---|
mps3/corstone300/fvp | 构建 Secure(或仅 Secure)固件 |
mps3/corstone300/fvp/ns | 构建 Non-Secure 固件 |
- FPGA 用法:不适用(N/A)。
- FVP 用法:使用 FVP 前,先设置环境变量
ARMFVP_BIN_PATH,然后通过west build -t run运行:
export ARMFVP_BIN_PATH=/path/to/fvp/directory west build -b {BOARD qualifier from table above} samples/hello_world -t run要运行 Fixed Virtual Platform 仿真工具,需从 Arm 下载并安装「FVP model for the Corstone-300 MPS3」。官方测试使用的版本为11.24.13(2024-01-04)。
- QEMU 用法:不适用(N/A)。
MPS3 Corstone-310(AN555)
MPS3+ AN555 是 Cortex-M85 架构 SoC,支持 Secure 与 Non-Secure 固件构建:
| BOARD | 说明 |
|---|---|
mps3/corstone310/an555 | 构建 Secure(或仅 Secure)固件 |
mps3/corstone310/an555/ns | 构建 Non-Secure 固件 |
- FPGA 用法:按「编程与调试」章节执行。
- FVP 用法:该变体不支持 FVP。
- QEMU 用法:该板级变体不支持 QEMU。
MPS3 Corstone-310(FVP)
MPS3+ FVP 是 Cortex-M85 架构的仿真模型,支持 Secure 与 Non-Secure 固件构建:
| BOARD | 说明 |
|---|---|
mps3/corstone310/fvp | 构建 Secure(或仅 Secure)固件 |
mps3/corstone310/fvp/ns | 构建 Non-Secure 固件 |
- FPGA 用法:不适用(N/A)。
- FVP 用法:同样先设置环境变量
ARMFVP_BIN_PATH,再用west build -t run运行:
export ARMFVP_BIN_PATH=/path/to/fvp/directory west build -b {BOARD qualifier from table above} samples/hello_world -t run运行 Corstone-310 FVP 需下载并安装「FVP model for the Corstone-310 MPS3」,官方测试版本同为11.24.13(2024-01-04)。
- QEMU 用法:不适用(N/A)。
MPS3 AN536
MPS3 AN536 是 Cortex-R52x2 双核子系统示例。Zephyr 目前支持为CPU0构建固件:
| BOARD | 说明 |
|---|---|
mps3/an536/cpu0 | 为 R52 CPU0 构建固件 |
- FPGA 用法:不适用(N/A)。
- FVP 用法:不适用(N/A)。
- QEMU 用法:通过 QEMU 运行:
west build -b mps3/an536/cpu0 samples/hello_world -t run注意:板级限定符(Board qualifier)必须包含上述完整板名。仅写
mps3/corstone300、mps3/corstone310或mps3/an536而不带完整限定符是无效的。仓库 boards/arm/mps3/board.cmake 中对此有硬性校验——若只指定到 SoC 层级,构建系统会直接FATAL_ERROR并列出可用目标。
硬件组成
Arm MPS3 板卡提供以下硬件组件(详见 boards/arm/mps3/doc/index.rst):
CPU
- AN547 / AN552:Arm Cortex-M55 CPU + SSE-300 子系统的 Soft Macro Model(SMM)实现
- AN555:Arm Cortex-M85 CPU + SSE-310 子系统的 SMM 实现
- AN536:Arm Cortex-R52 CPU + Cortex-R52x2 子系统示例
内存
- 8MB BRAM
- 4GB DDR4 SODIMM(默认,可升级至 8GB)
- 16GB eMMC
- 8MB QSPI Flash
调试
- P-JTAG、F-JTAG、SWD、4-bit trace、16-bit trace
- 通过 USB 提供四个串口
接口
- AHB GPIO、UART、SPI、I2C、I2S
- Color LCD 串行接口、Ethernet、VGA
板载外设
- Color LCD、10 个 LED、8 个开关、2 个用户按键
这些板载 LED 与按键在设备树中有完整的节点定义。从 boards/arm/mps3/mps3_common.dtsi 可以看到 10 个gpio-leds(led_0~led_7为 USERLED0~7,led_8/led_9对应 PB1LED/PB2LED,由gpio_led0驱动)以及 2 个gpio-keys用户按键(USERPB0/USERPB1,由gpio_button驱动),并提供了led0、led1、sw0、sw1别名,方便应用通过gpio_dt_spec等 API 直接使用。
支持的设备特性
MPS3 板级支持的特性包括 CMSDK UART、CMSDK GPIO、NVIC、SYSTICK、Ethos-U55 NPU 等,均由 Zephyr 板级文档中的zephyr:board-supported-hw指令自动汇总生成。以 AN547 的设备树 boards/arm/mps3/mps3_corstone300_an547.dts 为例:
- 兼容字符串为
arm,mps3-an547,CPU 为arm,cortex-m55,MPU 采用arm,armv8.1m-mpu; chosen节点将zephyr,console/zephyr,shell-uart指向uart0,将zephyr,sram指向dtcm、zephyr,flash指向itcm;- Ethos-U55以
arm,ethos-u兼容字符串定义在0x48102000,中断号为 56,并启用secure-enable与privilege-enable; - NVIC 配置为
arm,num-irq-priority-bits = <3>。
内存布局(Corstone-300 示例)
AN547 设备树中的内存区域定义(Secure 地址,减去0x10000000即得到 Non-Secure 别名):
| 区域 | 地址 | 大小 | 说明 |
|---|---|---|---|
| ITCM | 0x10000000(别名0x0) | 512KB | Zephyr flash 区域 |
| SRAM | 0x11000000(别名0x01000000) | 2MB(FVP 为 1MB) | 通用 SRAM |
| DTCM | 0x30000000(别名0x20000000) | 512KB | Zephyr SRAM 区域 |
| ISRAM | 0x31000000(别名0x21000000) | 4MB(FVP 为 2MB) | 额外 SRAM |
| DDR4 | 0x60000000起 | 2GB,每 256MB 交替 Non-Secure/Secure | 外部内存 |
此外,Non-Secure 构建会引入 8MBsoc-nv-flash控制器(基址0x28000000,擦除块 64KB、写块 4 字节),并定义 TF-M 多镜像启动所需的分区:slot0_partition(512KB @0x0)、slot0_ns_partition(3MB @0x80000)、slot1_partition(512KB @0x380000)、slot1_ns_partition(3MB @0x400000)与scratch_partition(512KB @0x700000),详见 boards/arm/mps3/mps3_common_ns.dtsi。这些分区布局需要与 TF-M 工程在flash_layout.h中的定义保持一致。
串口布局
MPS3 共有6 个 UART。Zephyr 控制台输出默认使用UART0,通过 Debug USB 接口(J8)对外暴露。Debug USB 接口上的串口映射如下:
| Debug USB 串口 | 连接 |
|---|---|
| Serial port 0 | MCC 板级控制控制台 |
| Serial port 1 | UART 0(Zephyr 默认控制台) |
| Serial port 2 | UART 1 |
| Serial port 3 | UART 2 |
对于AN536,Cortex-R52x2 子系统提供 LLPP UART0 与 LLPP UART1 作为 CPU 私有 UART,另有共享的 CMSDK UART。mps3/an536/cpu0目标使用LLPP UART0作为 Zephyr 控制台。从 boards/arm/mps3/mps3_an536_cpu0.dts 可以看到,uart0位于0xe7c00000,兼容arm,cmsdk-uart,中断挂在 GIC 上(GIC_PPI 2),波特率115200。
编程与调试
MPS3 通过 USB 连接主机,暴露Mass Storage(大容量存储)、CMSIS-DAP以及串口。
使用 AN547 构建应用
应用可以按常规方式构建。以hello_world示例 + AN547 为例:
west build -b mps3/corstone300/an547 samples/hello_world打开串口终端(minicom、putty 等),使用以下设置:
- 波特率(Speed):115200
- 数据位(Data):8 bits
- 校验(Parity):None
- 停止位(Stop bits):1
复位板卡后,在对应串口上应看到如下输出:
Hello World! mps3上传应用到 MPS3 AN547
应用固件可以是elf、hex 或 bin格式。二进制文件在板卡启动时,从板载 Micro SD 卡上的文件加载烧录。Motherboard Configuration Controller(MCC)负责加载 FPGA 镜像与二进制文件。
将 MPS3 通过 USB 连接到主机后,会出现一个大容量存储设备(默认设备名为V2M-MPS3)。更新固件共需3 步:
- 将应用文件复制到
<MPS3 device name>/SOFTWARE/目录; - 打开
<MPS3 device name>/MB/HBI0309C/AN547/images.txt; - 按下述内容更新
images.txt:
TITLE: Versatile Express Images Configuration File [IMAGES] TOTALIMAGES: 1 ;Number of Images (Max: 32) IMAGE0ADDRESS: 0x01000000 ;Please select the required executable program IMAGE0FILE: \SOFTWARE\zephyr.elf复位板卡后,即可在对应串口看到Hello World! mps3输出。这里IMAGE0ADDRESS: 0x01000000对应设备树中 SRAM 的 Non-Secure 别名地址(0x11000000减去0x10000000),与 boards/arm/mps3/mps3_corstone300_an547.dts 的 SRAM 定义一致。
使用 AN536 构建并运行应用
同样以hello_world为例构建 AN536 固件:
west build -b mps3/an536/cpu0 samples/hello_world使用 QEMU 运行:
west build -b mps3/an536/cpu0 samples/hello_world -t run运行后应看到:
Hello World! mps3/an536/cpu0源码级深入:仿真平台的选择机制
文档中提到的「AN547 默认 QEMU、FVP 变体默认 FVP」的机制,实现在 boards/arm/mps3/board.cmake 中:
mps3/an536/cpu0与mps3/corstone300/an547:SUPPORTED_EMU_PLATFORMS为qemu,QEMU 分别使用-cpu cortex-r52 -machine mps3-an536与-cpu cortex-m55 -machine mps3-an547;mps3/corstone300/fvp/_ns:SUPPORTED_EMU_PLATFORMS为armfvp,根据是否启用 Ethos-U65 选择FVP_Corstone_SSE-300_Ethos-U55或FVP_Corstone_SSE-300_Ethos-U65二进制;mps3/corstone310/fvp/_ns:使用FVP_Corstone_SSE-310,并针对 Zephyr 的 MPU 测试需求设置-C cpu0.MPU_S=16等参数;启用 PAC/BTI 时追加-C cpu0.CFGPACBTI=1;- 所有 FVP 运行均配置
-C mps3_board.uart0.out_file=-等参数将 UART0~UART2 输出重定向到终端,并关闭可视化与 telnet; - 若以
BUILD_WITH_TFM构建 Non-Secure 镜像,QEMU/FVP 会加载合并后的tfm_merged.hex(Secure TF-M + Non-Secure Zephyr)。
Secure / Non-Secure 构建的默认配置
从 boards/arm/mps3/Kconfig.defconfig 可以看出:
- 当目标为 Non-Secure(
TRUSTED_EXECUTION_NONSECURE)时,默认强制使用 TF-M 作为安全执行环境(BUILD_WITH_TFM=y),并从设备树 flash 分区获取 NS 镜像配置(USE_DT_CODE_PARTITION=y); - 在 QEMU 目标下,MPU 的空指针解引用检测无法生效(
0x0-0x400未映射但 QEMU 仍允许总线访问),因此默认关闭NULL_POINTER_EXCEPTION_DETECTION; - 启用串口时默认开启
UART_INTERRUPT_DRIVEN; - 对 AN555/FVP 且启用 ROM 重定位时,ROMSTART 区域地址取自设备树
itcm节点。
在 defconfig 层面,Secure 目标(如 boards/arm/mps3/mps3_corstone300_an547_defconfig)会显式设置CONFIG_ARM_TRUSTZONE_M=y、CONFIG_ARM_MPU=y、CONFIG_RUNTIME_NMI=y以及CONFIG_TRUSTED_EXECUTION_SECURE=y(配合QEMU_ICOUNT_SHIFT=7);Non-Secure 目标(如 boards/arm/mps3/mps3_corstone300_an547_ns_defconfig)则不再声明TRUSTED_EXECUTION_SECURE(QEMU_ICOUNT_SHIFT=6),交由 TF-M 承担 Secure 侧职责。SOC 层级的选择逻辑(SOC_CORSTONE300/SOC_CORSTONE310/SOC_AN536_CPU0)位于 boards/arm/mps3/Kconfig.mps3。
延伸参考
如需更深入的信息,可查阅以下官方资料(均为 Arm 公开发布的文档,需自行从 Arm 官网获取):MPS3 AN536 Application Note、MPS3 AN547 / AN552 / AN555 Technical Reference Manual(TRM)、MPS3 FPGA Prototyping Board TRM、Cortex-R52 TRM、Cortex-M55 / Cortex-M85 Generic User Guide,以及 CoreLink SSE-300 / SSE-310 Example Subsystem 文档。这些资料对理解 FPGA 镜像的加载流程、内存映射与外设寄存器细节很有帮助。
小结
- 在AN547 / AN552 / AN555 实体 FPGA 板上开发,使用
mps3/corstone300/an547(或ns后缀变体)等目标,按「构建 → 拷贝到 Micro SD → 修改images.txt→ 复位」的流程烧录; - 需要Ethos-U55 NPU仿真时,使用
mps3/corstone300/fvp或mps3/corstone310/fvp目标并安装对应 FVP 模型(测试版本 11.24.13); - 快速无硬件验证时,
mps3/corstone300/an547可直接用 QEMU 运行,mps3/an536/cpu0(Cortex-R52)则必须通过 QEMU 的mps3-an536机器; - 所有板级限定符必须写完整(如
mps3/corstone300/an547),省略变体名会触发构建错误。
通过本文,你已经可以依据目标硬件形态(FPGA 板 / FVP / QEMU)和固件形态(Secure / Non-Secure)选择合适的 MPS3 板级目标,并完成从编译到部署、调试的完整闭环。
【免费下载链接】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),仅供参考