Zephyr RTOS 在 Khadas Edge-V(RK3399)上的移植与启动指南
2026/9/18 22:54:34 网站建设 项目流程

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@1cpu@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

执行流程:

  1. tftpboot ${pxefile_addr_r} zephyr.img:通过 TFTP 将镜像下载到pxefile_addr_r所指向的 DDR 缓冲区;
  2. bootm start ${pxefile_addr_r}:启动 bootm 流程,解析镜像头;
  3. bootm loados:将操作系统镜像(此处即 Zephyr)加载到其声明的加载地址 0x10000000;
  4. 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询