Zephyr RTOS 在 Khadas Edge-V(RK3399)上的移植与启动指南
【免费下载链接】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 仓库中 Khadas Edge-V 板级支持文档 为核心,系统讲解在 Khadas Edge-V 单板计算机(基于 Rockchip RK3399 SoC、ARM64 架构)上构建、打包并启动 Zephyr 应用(以hello_world为例)的完整流程。读完本文,你将掌握该板的硬件资源与串口布局、Non-SMP 模式下的构建配置,以及通过 U-Boot 将 Zephyr 镜像加载到 DDR 并引导运行的具体命令。
板卡概览:Khadas Edge-V 与 RK3399
Khadas Edge-V 是 Khadas 推出的一款单板计算机(SBC),属于 Edge 系列中的 "V"(Vim 风格)变体。其完整硬件资料可参阅 Khadas 官方文档(Edge-V 产品页与 Edge 1 硬件文档,本文不展开转载外部内容)。
从 board.yml 可以看到 Zephyr 对该板的官方定义:
board: name: khadas_edgev full_name: Edge-V vendor: khadas socs: - name: rk3399而 khadas_edgev.yaml 则明确了该板在 Zephyr 构建系统中的关键属性:
identifier: khadas_edgev name: Khadas Edge-V (single core, non SMP) type: mcu arch: arm64 toolchain: - zephyr - cross-compile ram: 8192 vendor: khadas几个关键点:
- 架构与工具链:板级标识为
khadas_edgev,架构为arm64,同时支持 Zephyr SDK 自带工具链(zephyr)与通用交叉编译工具链(cross-compile); - 内存资源:
ram: 8192表示板卡具备 8 GB DDR 内存,Zephyr 镜像正是被加载进这段 DDR 中运行的; - 单核模式:板名中明确标注 "single core, non SMP"——本板移植当前仅启用 RK3399 的单个 Cortex-A72 核心,不启用 SMP 多核调度。
SoC 与板级代码的关联
Kconfig.khadas_edgev 通过一行select SOC_RK3399将板卡与 Rockchip 的 RK3399 SoC 绑定。该符号在 soc/rockchip/rk3399/Kconfig.soc 中逐级展开:
config SOC_RK3399 bool select SOC_SERIES_RK3399 config SOC_SERIES_RK3399 bool select SOC_FAMILY_ROCKCHIP config SOC default "rk3399" if SOC_RK3399 config SOC_SERIES default "rk3399" if SOC_SERIES_RK3399由此形成BOARD_KHASAD_EDGEV → SOC_RK3399 → SOC_SERIES_RK3399 → SOC_FAMILY_ROCKCHIP的完整 Kconfig 依赖链,构建系统据此自动选择 RK3399 的 SoC 移植代码、设备树与链接脚本。
硬件特性与串口控制台
Supported Features
该板的支持特性由文档中的zephyr:board-supported-hw指令在文档生成阶段自动展开(依据 khadas_edgev.dts 中的设备树节点生成)。
板级设备树的关键配置如下:
/dts-v1/; #include <rockchip/rk3399.dtsi> / { model = "Khadas Edge-V"; compatible = "khadas,edgev"; chosen { zephyr,sram = &sram0; zephyr,console = &uart2; zephyr,shell-uart = &uart2; }; cpus { /delete-node/ cpu@1; /delete-node/ cpu@2; /delete-node/ cpu@3; /delete-node/ cpu@4; /delete-node/ cpu@5; }; }; &uart2 { status = "okay"; };值得注意的实现细节:
- 串口控制台:板上有多个串口,Zephyr 选用
uart2作为串口控制台(zephyr,console)与 shell 串口(zephyr,shell-uart),且设备树中显式将uart2状态置为okay; - 单核裁剪:
cpus节点通过/delete-node/删除了cpu@1至cpu@5共 5 个核,仅保留cpu@0,从设备树层面固化了 "Non-SMP 单核" 的移植定位,这与板名中 "single core, non SMP" 的描述完全一致。
板级默认配置(defconfig)
khadas_edgev_defconfig 提供了运行 Zephyr 所需的最小化平台配置:
# Platform Configuration CONFIG_ARM64_VA_BITS_40=y CONFIG_ARM64_PA_BITS_40=y CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=24000000 CONFIG_CACHE_MANAGEMENT=y CONFIG_ARMV8_A_NS=y # Serial Drivers CONFIG_SERIAL=y CONFIG_UART_INTERRUPT_DRIVEN=y # Enable Console CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y逐项含义:
| 配置项 | 作用 |
|---|---|
CONFIG_ARM64_VA_BITS_40/CONFIG_ARM64_PA_BITS_40 | 将 ARM64 虚拟地址与物理地址宽度限定为 40 位,匹配 RK3399 的地址空间能力 |
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=24000000 | 系统时钟硬件周期频率 24 MHz,供内核周期计数与超时机制使用 |
CONFIG_CACHE_MANAGEMENT=y | 启用缓存管理(Cache Management),支持缓存维护操作 |
CONFIG_ARMV8_A_NS=y | 以 ARMv8-A 非安全(Non-Secure)模式运行 |
CONFIG_SERIAL=y+CONFIG_UART_INTERRUPT_DRIVEN=y | 启用串口驱动及中断驱动模式 |
CONFIG_CONSOLE=y+CONFIG_UART_CONSOLE=y | 启用内核控制台并通过 UART 输出 |
构建 Zephyr 应用(Non-SMP 模式)
按官方文档,使用如下配置即可在 Khadas Edge-V 上运行基础 Zephyr 应用与内核测试。以hello_world为例:
west build -b khadas_edgev samples/hello_world等价地,也可使用cmake直接构建:
cmake -DBOARD=khadas_edgev -B build samples/hello_world cmake --build build说明:上述命令面向 Unix 主机环境(
host-os: unix),要求已安装 Zephyr SDK 或等效的 ARM64 交叉编译工具链。文档原文指出 "This will build an image with the synchronization sample app",从仓库现状看samples/hello_world生成的是经典 Hello World 镜像,其启动横幅与输出即本文后续展示的内容。
生成可启动的 U-Boot 镜像
Zephyr 直接产出 ELF 与zephyr.bin原始二进制。由于 RK3399 由 U-Boot 负责引导,需要先用mkimage将裸二进制封装为 U-Boot 可识别的镜像格式:
mkimage -C none -A arm64 -O linux -a 0x10000000 -e 0x10000000 -d build/zephyr/zephyr.bin build/zephyr/zephyr.img参数拆解:
| 参数 | 含义 |
|---|---|
-C none | 不使用压缩 |
-A arm64 | 目标架构为 ARM64 |
-O linux | 操作系统类型标记为 Linux(U-Boot 引导约定) |
-a 0x10000000 | 镜像加载地址 0x10000000(DDR 起始区段) |
-e 0x10000000 | 入口点地址,与加载地址一致 |
-d build/zephyr/zephyr.bin | 输入:Zephyr 构建产物原始二进制 |
build/zephyr/zephyr.img | 输出:U-Boot 镜像 |
通过 U-Boot 引导 Zephyr
从网络(TFTP)加载并启动
板卡上电进入 U-Boot 后,可通过 TFTP 将zephyr.img下载到 DDR 并引导:
tftpboot ${pxefile_addr_r} zephyr.img; bootm start ${pxefile_addr_r}; bootm loados; bootm go执行流程:
tftpboot ${pxefile_addr_r} zephyr.img:通过 TFTP 将镜像下载到pxefile_addr_r所指向的 DDR 缓冲区;bootm start ${pxefile_addr_r}:启动 bootm 流程,解析镜像头;bootm loados:将操作系统镜像(此处即 Zephyr)加载到其声明的加载地址 0x10000000;bootm go:跳转到入口点 0x10000000,将控制权交给 Zephyr 内核。
预期控制台输出
引导成功后,串口控制台(uart2)将输出 Zephyr 启动横幅与应用输出:
*** Booting Zephyr OS build XXXXXXXXXXXX *** Hello World! khadas_edgev其中XXXXXXXXXXXX为实际构建的版本字符串,Hello World! khadas_edgev表明应用运行于khadas_edgev板。
Flashing:镜像的加载途径
Zephyr 镜像可被加载到 DDR 地址0x10000000,加载来源包括:
- SD 卡(SD Card):将
zephyr.img放入 SD 卡文件系统,由 U-Boot 读取并加载; - EMMC:烧写至板载 eMMC 存储,U-Boot 从中读取;
- QSPI Flash:烧写至 SPI NOR Flash,U-Boot 从中读取;
- 网络(Network):即上文介绍的 TFTP 方式,在 U-Boot 中从网络下载。
由于 RK3399 的 U-Boot 具备从上述介质引导的能力,Zephyr 镜像无需烧写 Flash 也能以 "下载即运行" 的方式快速验证,非常适合内核与驱动的迭代调试。
参考资料与延伸阅读
- 本文核心依据:Khadas Edge-V 板级文档
- 板级 Kconfig:Kconfig.khadas_edgev
- 板级设备树:khadas_edgev.dts
- 板级默认配置:khadas_edgev_defconfig
- RK3399 SoC 移植:soc/rockchip/rk3399/Kconfig.soc
- 同系列板卡(Edge2)文档:boards/khadas/edge2/doc/index.rst
- Khadas 板卡文档索引:boards/khadas/index.rst
如需了解 RK3399 SoC 层的时钟、串口等外设实现,可继续查阅soc/rockchip/rk3399/目录下的源码;实际硬件规格(如引脚定义、供电、启动介质开关)请以 Khadas 官方硬件文档为准。
【免费下载链接】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),仅供参考