ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

在 Xilinx Kria KV260 的 Cortex-R5 实时处理单元上运行 Zephyr RTOS:板级支持解析与 remoteproc 部署实战

2026/9/16 1:45:36 拓冰建站 浏览量
在 Xilinx Kria KV260 的 Cortex-R5 实时处理单元上运行 Zephyr RTOS:板级支持解析与 remoteproc 部署实战 在 Xilinx Kria KV260 的 Cortex-R5 实时处理单元上运行 Zephyr RTOS板级支持解析与 remoteproc 部署实战【免费下载链接】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 项目中 Xilinx/AMD Kria KV260 开发板实时处理单元RPU的板级支持kv260_r5展开系统梳理该配置的硬件外设映射、内存布局、构建选项并给出从 LinuxAPU侧通过 remoteproc 向 RPU 加载 Zephyr 固件的完整实战流程。读完本文你将掌握kv260_r5板卡配置的全部细节能够在真实 KV260 板卡上构建并运行 hello world 示例并理解其底层 SoC 支持代码的工作方式。Xilinx/AMD Kria KV260 Vision AI Starter Kit 开发板实物图板级支持总览面向 KV260 实时处理单元RPUkv260_r5是 Zephyr 为 Xilinx KV260 开发板提供的板级支持配置其目标并非板上的应用处理单元APU四核 Cortex-A53而是板载的实时处理单元RPUReal-time Processing Unit。该配置由 boards/amd/kv260_r5/ 目录下的板级文件定义RPU 由两个独立的 ARM Cortex-R5 核心组成并且支持以下两种运行模式两个独立的 R5 核心各自拥有独立的紧耦合内存TCMTightly Coupled Memory或者作为单个双锁步dual lock-step单元运行此时 TCM 容量翻倍。RPU 基于 ARM Cortex-R5 CPUZephyr 的kv260_r5配置同时使能了以下片上设备ARM PL-390 通用中断控制器GIC作为系统中断控制器板级 DTS 中通过interrupt-controllerf9000000节点启用Xilinx Zynq TTCCadence TTC定时器作为系统定时器时钟源Xilinx Zynq UART提供串行控制台。从板卡元数据看boards/amd/kv260_r5/board.yml 声明其完整名称为 KV260 Development Board RPU Cortex-R5SoC 为zynqmp_rpu厂商为amdboards/amd/kv260_r5/kv260_r5.yaml 则记录了该板卡的架构arm、工具链zephyr、RAM65536 KB、Flash32768 KB以及支持的外设类型i2c、eeprom、gpio、rtc并标记忽略 net 与 bluetooth 相关测试。硬件特性支持的设备与资源系统定时器kv260_r5板级配置使用1000 Hz的系统定时器 tick 频率。该配置在 kv260_r5_defconfig 中通过CONFIG_SYS_CLOCK_TICKS_PER_SEC1000显式设定同时板级 DTS 在 kv260_r5.dts 中启用了ttc0定时器节点ttc0 { status okay; clock-frequency 100000000; };ttc0位于0xff110000见 dts/arm/xilinx/zynqmp.dtsi兼容xlnx,ttcps。底层 SoC 配置 soc/xlnx/zynqmp/Kconfig.defconfig 将硬件时钟频率直接绑定到 DTS 中的ttc0节点属性config SYS_CLOCK_HW_CYCLES_PER_SEC default $(dt_nodelabel_int_prop,ttc0,clock-frequency)这意味着系统硬件时钟周期频率由 DTS 中ttc0的clock-frequency 100000000100 MHz决定Kconfig 在构建时自动提取无需手工维护。串口板级配置使用单个串行通信通道即片上的UART1。uart1节点在 kv260_r5.dts 中启用uart1 { status okay; current-speed 115200; clock-frequency 99999901; };current-speed 115200波特率 115200clock-frequency 99999901约 100 MHz 的 UART 参考时钟。在 DTSchosen节点中zephyr,console与zephyr,shell-uart均指向uart1。硬件上uart1位于0xff010000兼容xlnx,xuartps见 dts/arm/xilinx/zynqmp.dtsi其中断为 GIC SPI 22。默认配置通过CONFIG_UART_XLNX_PSy使能 Xilinx PS UART 驱动。存储器虽然 Flash、DDR 和 OCM 内存区域都在 DTS 文件中定义但应用程序的全部代码与数据都会加载到sram0区域而sram0实际指向的是 DDR 内存。这一点在板级 DTS 中有明确体现sram0: memory0 { compatible mmio-sram; reg 0 DT_SIZE_M(64); }; chosen { zephyr,sram sram0; zephyr,flash flash0; zephyr,console uart1; zephyr,shell-uart uart1; zephyr,ocm ocm; };sram0起始地址0x0大小 64 MB指向 DDR 低地址空间是所有 Zephyr 代码与数据的加载位置flash0位于0xc0000000、大小 32 MB 的soc-nv-flash见 dts/arm/xilinx/zynqmp.dtsi在板级 DTS 中作为zephyr,flash被引用ocm即片上内存OCM位于0xfffc0000大小 256 KB见 dts/arm/xilinx/zynqmp.dtsi标记为zephyr,memory-region OCM。当前该区域可供使用但默认不会在其中放置任何内容适合存放需要极低延迟访问的数据或固件段。由于配置为非 XIPCONFIG_XIPn见下文固件从 DDR 中的sram0执行这也是通过 remoteproc 向 RPU 加载 ELF 镜像后即可运行的原因。配置与构建解析板级 defconfigkv260_r5_defconfig 是kv260_r5板卡的默认配置逐项含义如下配置项取值说明CONFIG_XIPn关闭就地执行XIP代码从 DDRsram0加载执行CONFIG_ISR_STACK_SIZE512中断服务例程栈大小 512 字节CONFIG_THREAD_STACK_INFOy启用线程栈信息便于调试与诊断CONFIG_SERIALy启用串行驱动框架CONFIG_CONSOLEy启用控制台CONFIG_UART_CONSOLEy启用 UART 控制台后端CONFIG_UART_XLNX_PSy启用 Xilinx PS UART 驱动xlnx,xuartpsCONFIG_SYS_CLOCK_TICKS_PER_SEC1000系统 tick 频率 1000 HzCONFIG_ARM_MPUy启用 ARM MPU 内存保护此外boards/amd/kv260_r5/Kconfig.defconfig 中还有一些条件性默认配置CONFIG_BUILD_OUTPUT_BIN默认置y即默认生成.bin格式的构建产物除 ELF 之外便于通过 remoteproc 或 JTAG 加载在启用用户空间USERSPACE时CONFIG_COMPILER_ISA_THUMB2默认置n即用户空间代码使用 ARM 指令集而非 Thumb-2。板级 Kconfig 入口 boards/amd/kv260_r5/Kconfig.kv260_r5 非常简单选中BOARD_KV260_R5即select SOC_XILINX_ZYNQMP_RPU进而关联到 soc/xlnx/zynqmp/Kconfig.soc 中定义的SOC_XILINX_ZYNQMP_RPU符号。构建 hello world 示例在 Zephyr 环境已source zephyr-env.sh下构建 hello world$ west build -b kv260_r5 samples/hello_world或使用 cmake 方式$ cmake -DBOARDkv260_r5 -B build samples/hello_world $ cmake --build build构建产物build/zephyr/zephyr.elf以及默认同时生成的zephyr.bin即为待部署到 RPU 的固件镜像。已知问题与限制kv260_r5板级配置当前存在以下明确的功能限制双冗余核锁步DCLSDual-redundant Core Lock-step执行暂不支持当前仅支持两个 R5 核独立运行模式锁步模式尚未在 Zephyr 中实现仅支持 R5 子系统的第一个核心从板级 DTS 可以印证dts/arm/xilinx/zynqmp_rpu.dtsi 中只定义了cpu0兼容arm,cortex-r5f一个 CPU 节点Xilinx Zynq TTC 驱动不支持 tickless无节拍模式运行系统定时器必须依赖周期性 tick本板为 1000 HzCortex-R5 与 Cortex-A53 共享同一个 UART 控制器这是硬件层面的限制详情见下文部署环节的处理方式。编程与调试通过 remoteproc 从 Linux 加载固件当前在真实 KV260 板卡上运行 Zephyr 最推荐的方式是由运行 Linux 的 APU 通过 remoteproc 框架将 Zephyr 固件加载到 RPU 上运行。前提是目标板卡的 Linux 内核支持 remoteproc。准备 Linux 镜像用户可以选用 Xilinx 官方预构建的Petalinux 参考镜像作为起点以启用 remoteproc 支持。该参考镜像基于 Xilinx 维护的 5.15 内核相关内容可从 Xilinx Wiki 的 Kria K26 SOM 页面PetaLinux 小节获取。另一个选项是使用openAMP 项目提供的参考镜像其 CI 发布页面中针对 KV260 目标提供了xilinx-kv260.tar.gz压缩包。将镜像部署到目标 SD 卡$ sudo mount /dev/user-sd /media/rootfs $ sudo tar -C /media/rootfs -xzf xilinx-kv260.tar.gz $ sudo umount /media/rootfs将解压后的 SD 卡插入板卡插槽即完成 Linux 根文件系统的准备。构建 Zephyr 应用以 hello world 为例在主机上构建$ west build -b kv260_r5 samples/hello_world完成后将生成 ELF 固件默认位于build/zephyr/zephyr.elf。处理共享 UART 的限制由于硬件限制Linux 与 Zephyr 共享同一个 UART 控制器当 Zephyr 应用启动后会接管 Linux 的控制台。为了避免这一限制对 Linux shell 操作的影响建议通过ssh 网络连接访问开发板的 Linux shell而非使用板上的 FTDI USB 串口接口开发板与主机连接到同一网络。假设使用 Xilinx 参考镜像默认的petalinux用户在主机终端 ssh 到开发板板卡 IP 可通过ifconfig查询$ ssh petalinuxboard-ip-address初始密码为petalinux。部署固件并启动在另一个终端中使用scp或rsync将 Zephyr 应用的.elf文件上传到开发板$ scp /path/to/zephyr_app_elf_file petalinuxboard-ip-address:/home/petalinux然后将文件移动到/lib/firmware目录并以 root 权限通过 remoteproc 启动固件$ sudo -i # You need to operate the remoteproc as root $ echo zephyr.elf /sys/class/remoteproc/remoteproc0/firmware $ echo start /sys/class/remoteproc/remoteproc0/state观察运行输出在主机上通过另一个终端连接 UART1由板上 FTDI 芯片提供的 tty 端口之一即可看到 Zephyr 应用运行*** Booting Zephyr OS build v3.4.0 *** Hello World kv260_r5!注输出中的构建版本号随实际 Zephyr 版本而定此处为文档记录时的典型输出样式。备选调试方式JTAGxsdb除 remoteproc 之外板卡还支持通过 XilinxxsdbXilinx Software Debugger工具链进行 JTAG 加载调试。boards/amd/kv260_r5/board.cmake 引入了通用的xsdb.board.cmake而板卡专属的 boards/amd/kv260_r5/support/xsdb.cfg 定义了完整的 JTAG 加载流程boot_jtag将 PSU 目标切换为 JTAG 启动模式——停止目标、将 multiboot 寄存器清零mwr 0xffca0010 0x0、修改启动模式寄存器mwr 0xff5e0200 0x0100、执行系统复位rst -systemload_image支持传入elf、fsblFSBL 引导固件及可选的bitstreamFPGA 比特流。流程为连接硬件服务器可通过环境变量HW_SERVER_URL指定、设置 JTAG 启动模式、选择 R5 核心*R5*#0、可选加载比特流、加载并运行 FSBL、随后加载 Zephyr ELF 并运行。该脚本可供在 JTAG 环境下开发调试 R5 固件时参考例如运行xsdb support/xsdb.cfg并配合相应参数。底层原理SoC 支持与初始化理解kv260_r5的运行机制还需要了解其所依赖的 ZynqMP RPU SoC 支持层。SoC 选择与中断配置soc/xlnx/zynqmp/Kconfig.soc 中定义了两个 SoC 变体SOC_XILINX_ZYNQMP_RPUCortex-R5 实时单元与SOC_XILINX_ZYNQMP_APUCortex-A53 应用单元二者都隶属于SOC_XILINX_ZYNQMP家族。RPU 变体的SOC符号解析为zynqmp_rpu。soc/xlnx/zynqmp/Kconfig.defconfig 中为 RPU 变体设置了NUM_IRQS默认220注释明确指出必须大于实际使用的中断号并需包含 UART 中断SYS_CLOCK_HW_CYCLES_PER_SEC从ttc0节点的clock-frequency属性自动推导前文已述FLASH_SIZE与FLASH_BASE_ADDRESS从zephyr,flashchosen 节点即flash0自动推导。系统初始化与重启soc/xlnx/zynqmp/soc.c 提供了 RPU 侧的关键底层逻辑soc_early_init_hook()在系统早期初始化阶段启用指令缓存与数据缓存sys_cache_instr_enable()/sys_cache_data_enable()soc_reset_hook()将 SCTLR 的 V 位清零使异常向量表使用正常的0x0-0x1C地址区间sys_arch_reboot()通过写CRL_APB_RESET_CTRL寄存器的复位掩码触发系统重启。RPU-APU 通信通道IPIdts/arm/xilinx/zynqmp_rpu.dtsi 除了定义 R5 CPU 与 GICarm,gic-v1位于0xf9000000SPI 中断之外还定义了IPI 邮箱mailbox节点xlnx,zynqmp-ipi-mailbox例如rpu0_ipi0xff310000与rpu1_ipi0xff320000并描述了 RPU0 与 APU、RPU0 与 RPU1 之间的邮箱寄存器区域。这些节点当前默认为disabled但从结构上为 Zephyr 运行在 RPU 时与 LinuxAPU侧进行核间通信预留了标准通道未来可在其上构建 IPC 能力。参考资料ARMv7-A and ARMv7-R Architecture Reference ManualARM DDI 0406C ID051414Cortex-R5 and Cortex-R5F Technical Reference ManualARM DDI 0460C ID021511Zynq UltraScale Device Technical Reference ManualUG1085Kria KV260 Vision AI Starter Kit User GuideUG1089更多板级与 SoC 细节可继续在仓库内查阅板级 DTSboards/amd/kv260_r5/kv260_r5.dts板级默认配置boards/amd/kv260_r5/kv260_r5_defconfig板卡元数据boards/amd/kv260_r5/kv260_r5.yaml、boards/amd/kv260_r5/board.ymlSoC 公共 DTSdts/arm/xilinx/zynqmp_rpu.dtsi、dts/arm/xilinx/zynqmp.dtsiSoC 配置与初始化soc/xlnx/zynqmp/Kconfig.soc、soc/xlnx/zynqmp/Kconfig.defconfig、soc/xlnx/zynqmp/soc.c【免费下载链接】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),仅供参考