T153核心板A7+RISC-V异构双系统开发实战:从固件部署到RPMsg通信

武汉万象奥科
2026-10-29
来源:

01


概述


V-CORE-T153-S 采用 Cortex-A7 与 RISC-V E907 异构处理架构。Cortex-A7 运行 Linux,承担图形界面、网络通信、文件管理和应用处理;E907 运行 FreeRTOS,承担实时任务和核间通信。

两个处理系统通过 OpenAMP、RPMsg、共享内存和硬件消息盒协同工作。本文主要介绍开发环境、固件编译与部署、启动检查、RPMsg 通信测试及应用开发方法。

项目
Cortex-A7 侧
E907 侧
处理架构
ARM Cortex-A7
RISC-V E907
操作系统
Linux 5.10
Tina FreeRTOS
编译工具链
arm-linux-gnueabihf
riscv64-unknown-elf,构建目标为 RV32
通信框架
remoteproc、virtio、RPMsg
OpenAMP、RPMsg
调试入口
Linux 调试串口、ADB、共享日志
Linux 读取 E907 共享日志



1.1芯片框图

本文中的命令分为三个执行环境:

环境
执行位置
典型操作
开发主机
Linux PC 的 Bash 终端
配置 SDK、交叉编译、生成固件
开发板 Linux
V-CORE-T153-S 的调试串口或 ADB Shell
加载 E907、查看日志、运行通信测试
E907 控制台
通过 RPMsg 控制台进入的 FreeRTOS 命令环境
执行 E907 的 HAL 测试命令


代码块不包含终端提示符,可直接复制执行。开发主机路径采用/data/tina5.0-t153,SDK 放在其他目录时替换相应前缀。板端示例以 root 身份执行。


1.2快速验证

使用配套完整固件启动开发板,在板端 Linux 执行:

cat/sys/class/remoteproc/remoteproc0/statels -l /dev/rpmsg_testhd-rpmsg-test 100 128 1000

状态为 running、测试完成数为 100 且失败数为 0,表示 E907 已启动并完成 RPMsg 请求应答验证。首次使用可按第 4~6 章完成编译、更新及启动检查,再进入外设开发与实时性评估。


02


软件资源


以下路径以 SDK 根目录 /data/tina5.0-t153 为基准。

路径
内容
rtos/
RISC-V 构建入口、配置
rtos/lichee/rtos/projects/t153_e907/bga_demo/
V-CORE-T153-S 使用的 E907 工程及已有适配
rtos/lichee/rtos/projects/t153_e907/bga_demo/src/main.c
应用入口、OpenAMP 初始化
rtos/lichee/rtos-components/thirdparty/openamp/
OpenAMP、RPMsg 组件及示例
rtos/lichee/rtos-components/thirdparty/openamp/rpmsg_demo/rpmsg_test.c
核间实时性测试服务
rtos/lichee/rtos-hal/
硬件抽象层与操作系统适配
rtos/lichee/hal_v2/hal/
本工程启用的 HAL V2 驱动、接口及外设例程
rtos/lichee/hal_v2/hal/examples/
GPIO、ADC、TWI、SPI、UART、CAN、定时器及 PWM 例程
rtos/board/t153_e907/bga_demo/configs/sys_config.fex
E907 资源配置
bsp/drivers/remoteproc/
Linux E907 加载与运行控制
bsp/drivers/rpmsg/
Linux RPMsg 通信驱动
device/config/chips/t153/configs/hd_t153_emmc/
eMMC 设备树、配置及固件
device/config/chips/t153/configs/hd_t153_nand/
NAND 设备树、配置及固件

bga_demo 是保留的 SDK 工程名称,该目录已包含  V-CORE-T153-S 的核间通信适配。

两个 Linux 项目的E907 固件均位于 bin/amp_rv0.bin。根文件系统生成流程优先安装对应板型目录中的固件。


03


AMP 启动流程


本项目采用 Linux 启动 E907 的方式:

1. Linux 初始化预留内存、消息盒和 remoteproc 驱动。

2. /etc/init.d/S62e907 在后台启动 E907。

3. remoteproc 加载 amp_rv0.bin,解析 ELF 和资源表,启动 E907。

4. E907 初始化 FreeRTOS 和 OpenAMP,发布 RPMsg 服务。

5. Linux 匹配 sunxi,rpmsg_test 服务,创建 /dev/rpmsg_test。

remoteproc 显示 running 仅表示处理核已经启动;测试设备节点出现,才表示对应 RPMsg 服务已完成发布及驱动匹配。


3.1预留内存

两个板型的 AMP 主要共享区域如下:

区域
起始地址
大小
用途
vdev0buffer
0x42100000
256 KiB
RPMsg 缓冲区
vdev0vring0
0x42140000
8 KiB
virtqueue 描述符
vdev0vring1
0x42142000
8 KiB
virtqueue 描述符
e907_rpbuf
0x42144000
512 KiB
RPBuf 共享内存
share_irq_table
0x421c4000
4 KiB
共享中断配置
E907 DRAM
0x421c5000
3 MiB
E907 程序运行区域
e907_mem_fw
0x44000000
2 MiB
固件暂存区域

修改内存布局时,必须同步 Linux 设备树、E907 链接脚本、资源表及相关内存保护配置。不得将这些区域作为 Linux 普通应用缓冲区使用。



04


开发环境与编译



4.1编译环境

V-EVB-T153-S 评估板进行,以配合产品标准驱动,减少二次开发

使用 SDK 配套的 Linux 开发环境和工具链。E907 工具链目录为:

rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/bin/

检查版本:

cd /data/tina5.0-t153rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-gcc --version

工具名称中的 riscv64 不代表本工程运行在 64 位核上,实际 ELF 应为 32 位 RISC-V。

主机需具备 Bash、GNU Make、GCC/G++、Python 3 和 ncurses 开发库。Ubuntu/Debian 环境可安装以下基础构建依赖:

sudo apt-get updatesudo apt-get install build-essential gcc-multilib g++-multilib \libncurses-dev flex bison libssl-dev python3 device-tree-compiler

SDK 应放在 Linux 本地文件系统中,保留执行权限和符号链接。编译使用普通开发用户,不使用 sudo ./build.sh。E907 裸机工具链与 Cortex-A7 Linux 应用工具链分别使用,不互相替代。

过程。

为了保证产品设计具有良好的兼容性和稳定性,用户没有使用到的引脚资源请务必悬空处理。

V-CORE-T153-S 核心板共160脚,引脚通过1.0mm间距的邮票孔引出;其实物引脚图如下图所示。


4.2编译 E907

方式一:Linux SDK 统一入口

在开发主机选择板型后执行:

cd /data/tina5.0-t153./build.sh autoconfig -i t153 -b hd_t153_emmc -o buildroot -k linux-5.10-origin -a arm -n default./build.sh rtos

NAND 板型将 hd_t153_emmc 替换为 hd_t153_nand。两个项目均配置 LICHEE_RTOS_PROJECT_NAME=t153_e907_bga_demo;统一入口自动编译 E907,并将 ELF 复制、strip 到所选板型的 bin/amp_rv0.bin,不需要再执行第 4.3 节的手动复制。更新一个项目不会自动同步另一个项目的固件。

方式二:独立 RTOS 入口

适合日常修改、增量编译和配置调试。在独立终端执行,避免与 Linux SDK 构建环境变量混用:

cd /data/tina5.0-t153/rtossource envsetup.shlunch_rtos t153_e907_bga_demomrtos

需要修改功能选项时,在选择工程后执行:

mrtos menuconfigmrtos

菜单中按 / 搜索配置符号,选择功能后保存退出。mrtos menuconfig 会将配置同步到工程 defconfig;仅运行 mrtos_menuconfig 修改工作 .config,后续 mrtos 可能重新载入工程默认配置,不能据此认定功能已保存。

需要清理当前 RTOS 工程输出时执行 mrtos clean,再执行 mrtos。这不是修改配置后的必需步骤。重新执行 lunch_rtos 会加载工程 defconfig,因此应先保存配置。

编译输出目录:

rtos/lichee/rtos/build/t153_e907_bga_demo/img/
文件
用途
rt_system.elf
remoteproc 加载的程序镜像来源
rt_system_debug.elf
保留调试符号,用于地址定位
rt_system.bin
原始二进制,不用于直接替代本项目的 amp_rv0.bin

部署前检查 ELF:

cd /data/tina5.0-t153RV_TOOLS=rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/binRV_IMAGE=rtos/lichee/rtos/build/t153_e907_bga_demo/img/rt_system.elf"$RV_TOOLS/riscv64-unknown-elf-readelf" -h "$RV_IMAGE""$RV_TOOLS/riscv64-unknown-elf-readelf" -l "$RV_IMAGE"


确认 Class: ELF32、Machine: RISC-V,并保留本次对应的调试 ELF、源代码版本与构建日志。


4.2.1 AMP 关键配置

V-CORE-T153-S 的基础 AMP 配置已纳入配套工程。扩展外设时保留下列配置关系:

E907 defconfig 路径:

rtos/lichee/rtos/projects/t153_e907/bga_demo/defconfig

Linux defconfig 路径:

device/config/chips/t153/configs/hd_t153_emmc/linux-5.10-origin/HD-T153-S-Linux_defconfigdevice/config/chips/t153/configs/hd_t153_nand/linux-5.10-origin/HD-T153-NAND-Linux_defconfig
配置位置
关键配置
作用
E907 defconfig
CONFIG_COMPONENTS_OPENAMP、CONFIG_COMPONENTS_LIBMETAL、CONFIG_AMP_SLAVE_MODE
OpenAMP 远端角色及基础库
E907 defconfig
CONFIG_DRIVERS_V2_MSGBOX
消息盒中断通知
E907 defconfig
CONFIG_RPMSG_TEST、CONFIG_RPMSG_CLIENT
实时性测试及端点控制服务
E907 defconfig
CONFIG_COMPONENTS_AMP_TIMESTAMP、CONFIG_AMP_TS_DEV_0
共享 24 MHz 时间戳
E907 defconfig
CONFIG_AMP_TRACE_SUPPORT
E907 共享日志
E907 defconfig
CONFIG_DISABLE_ALL_UART_LOG
禁用物理 UART 日志及主入口中的 UART CLI
Linux defconfig
CONFIG_AW_REMOTEPROC、CONFIG_AW_REMOTEPROC_E907_BOOT
E907 加载与运行控制
Linux defconfig
CONFIG_RPMSG_VIRTIO、CONFIG_AW_RPMSG_CTRL、CONFIG_AW_RPMSG_LITE_TEST
RPMsg 总线、控制及测试设备
Linux defconfig
CONFIG_AW_AMP_TIMESTAMP
Linux 共享时间戳接口


Linux 设备树将 firmware-name 设置为 amp_rv0.bin,通过 memory-region 指定运行区和 vring,通过 mboxes 指定消息盒。只启用 Kconfig 而未配置这些资源,不能完成核间通信。


4.3 置入固件

将 E907 ELF 制作成固件文件。以下命令在 Linux 开发主机执行:

cd /data/tina5.0-t153RV_TOOLS=rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/binRV_IMAGE=rtos/lichee/rtos/build/t153_e907_bga_demo/img/rt_system.elfRV_STAGE=$(mktemp -d /tmp/hd-e907-build.XXXXXX)cp "$RV_IMAGE" "$RV_STAGE/amp_rv0.bin""$RV_TOOLS/riscv64-unknown-elf-strip" "$RV_STAGE/amp_rv0.bin""$RV_TOOLS/riscv64-unknown-elf-readelf" -h "$RV_STAGE/amp_rv0.bin"cp "$RV_STAGE/amp_rv0.bin" device/config/chips/t153/configs/hd_t153_emmc/bin/amp_rv0.bincp "$RV_STAGE/amp_rv0.bin" device/config/chips/t153/configs/hd_t153_nand/bin/amp_rv0.binsha256sum device/config/chips/t153/configs/hd_t153_*/bin/amp_rv0.bin

修改前应归档原固件。此处的 .bin 文件仍是 ELF 格式,仅文件名沿用 SDK 约定。



4.4 生成完整固件

eMMC 项目:

cd /data/tina5.0-t153./build.sh autoconfig -i t153 -b hd_t153_emmc -o buildroot -k linux-5.10-origin -a arm -n default./build.sh bootloader./build.sh kernel./build.sh rootfs./build.sh pack

本流程使用已完成第 4.2 或 4.3 节更新的 E907 固件。需要在此处重新编译 E907 时,在生成 rootfs 前执行 ./build.sh rtos。

NAND 项目将选择命令中的板型替换为 hd_t153_nand,再执行相同的编译、打包命令。每一步成功后再执行下一步。

完整固件输出:

out/t153_linux_hd_t153_emmc_uart0.imgout/t153_linux_hd_t153_nand_uart0.img

必须按照实际存储器件选择镜像,不能将 eMMC 镜像用于 NAND 板卡,反之亦然。


05


固件部署与在线更新



5.1 完整固件烧写

设备接入烧写 USB 后,可在 Linux 执行:

syncreboot-efex

设备进入烧写模式后,通过配套上位机选择对应板型的完整 .img,执行下载并确认全部分区、校验及启动组件更新成功。分区写完但校验失败,不视为烧写完成。

新版 U-Boot 在 EFEX USB 循环、NAND/UBI 长循环和校验分块之间调度 PE0 外部看门狗翻转。首次从旧固件升级时,reboot-efex 仍运行设备内的旧 U-Boot;选择新版镜像不会立即替换正在执行的烧写程序。若旧版本会在烧写中复位,应按硬件调试流程临时停用外部看门狗完成首次升级,随后恢复并验证正常烧写。


5.2 判断 E907 固件加载来源

板端执行:

dmesg | grep -Ei 'Booting fw|load fw|firmware version|remote processor'cat /sys/class/remoteproc/remoteproc0/firmware

本项目加载器会尝试固件分区 riscv0、riscv0-r,在分区加载失败后回退到文件系统。出现以下日志说明使用了文件系统:

load fw from filesystem, filename: amp_rv0.bin

如果分区中存在可用固件,仅替换 /lib/firmware/amp_rv0.bin 可能不生效;修改 sysfs 的 firmware 名称也不等同于禁用分区加载。此时应更新完整固件,不要盲目对 MTD、UBI 或 eMMC 原始分区写入 ELF。



5.3 文件系统固件在线更新

本节仅适用于已确认采用文件系统加载的设备。PC 上传文件:

adb push amp_rv0.bin /tmp/amp_rv0.bin

也可通过已挂载的 TF 卡或 U 盘传入。先用 mount 确认实际挂载点,再将对应介质中的 amp_rv0.bin 复制到 /tmp/amp_rv0.bin。TF 卡、USB 介质和 eMMC 的 UDISK 是不同设备,不使用固定 mmcblk 序号判断固件所在介质。

板端备份、替换:

E907_BACKUP=$(mktemp -d /root/e907-backup.XXXXXX)cp /lib/firmware/amp_rv0.bin "$E907_BACKUP/amp_rv0.bin" || exit 1cp /tmp/amp_rv0.bin /lib/firmware/amp_rv0.bin.new || exit 1cmp /tmp/amp_rv0.bin /lib/firmware/amp_rv0.bin.new || exit 1chmod 644 /lib/firmware/amp_rv0.bin.newmv -f /lib/firmware/amp_rv0.bin.new /lib/firmware/amp_rv0.bin || exit 1syncreboot

替换文件不影响当前已加载的 E907 程序,重启后才生效。重启后检查构建时间、加载来源、设备节点及功能;需要回退时,用备份文件按相同步骤恢复。不要在生产任务运行期间直接停止远端处理核。



5.4 eMMC 与 NAND 的更新方式

项目
eMMC
NAND
完整固件
对应 eMMC 的 .img
对应 NAND 的 .img
文件系统更新
更新 /lib/firmware/amp_rv0.bin
更新 /lib/firmware/amp_rv0.bin
riscv0 存储形式
eMMC 命名分区
UBI 逻辑卷
riscv0 单独写入接口
确认目标后使用块设备写入
确认卷名后使用 ubiupdatevol
使用原则
文件更新前确认加载来源;分区模式优先使用完整镜像升级
不向原始 NAND MTD 或 ubiblock 设备直接写入 ELF


两种存储器的文件系统更新步骤相同,但 riscv0 分区更新接口不同。UBI 卷编号由实际分区布局决定,不能使用参考板的 /dev/ubi0_5 作为 HD-T153 固定地址。完整固件打包会同时携带对应 E907 固件和根文件系统中的固件副本。



06


启动检查与调试



6.1 基础检查

cat /sys/class/remoteproc/remoteproc0/namecat /sys/class/remoteproc/remoteproc0/statecat /var/log/hd-e907.logls /sys/bus/rpmsg/devices/ls -l /dev/rpmsg_testdmesg | grep -Ei 'e907|remoteproc|rpmsg|amp timestamp'

正常状态为 running,RPMsg 设备目录存在服务,/dev/rpmsg_test 为字符设备。

S62e907 start 为后台启动,status 可查询状态;该脚本的 stop 分支不停止 E907,不应作为远端处理核关闭命令使用。


6.2 读取 E907 日志

mkdir -p /sys/kernel/debugif ! grep -q ' /sys/kernel/debug debugfs ' /proc/mounts; thenmount -t debugfs debugfs /sys/kernel/debugficat /sys/kernel/debug/remoteproc/remoteproc0/aw_trace_log

正常启动记录包含 FreeRTOS 欢迎信息、OpenAMP 初始化和 sunxi,rpmsg_test 服务发布信息。日志位于共享环形缓冲区,读取可能消费内容,长时间不读取可能发生覆盖。运行自动化测试时由测试脚本保存日志,不要在其他终端同时读取。

V-CORE-T153-S  E907 评估固件关闭了物理 UART 控制台,以避免与 Linux 调试串口争用。优先使用共享日志,不要直接套用演示工程的 UART5 引脚作为本产品的调试串口。


6.3 地址定位

日志中出现程序地址时,使用同一次构建的调试 ELF 定位:

cd /data/tina5.0-t153rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-addr2line \-e rtos/lichee/rtos/build/t153_e907_bga_demo/img/rt_system_debug.elf \-a -f -C 0x421c5000

将示例地址替换为实际异常地址。不能用另一版本的 ELF 解读地址。


6.4 手动启动、停止与重新加载

这些操作用于开发调试。先停止正在使用 RPMsg、RPBuf 和远端外设的业务程序,并确认 /etc/init.d/S62e907 的后台启动过程已经结束。

板端 Linux 在状态为 offline 时执行:

echo amp_rv0.bin > /sys/class/remoteproc/remoteproc0/firmwareecho start > /sys/class/remoteproc/remoteproc0/statecat /sys/class/remoteproc/remoteproc0/state

停止正在运行的 E907:

echo stop > /sys/class/remoteproc/remoteproc0/statecat /sys/class/remoteproc/remoteproc0/state

预期停止后显示 offline。重新执行启动命令可再次加载固件。停止或启动返回错误时先检查 dmesg,不连续重复写入命令。远端重启会销毁原有通信端点,Linux 应用应关闭旧文件描述符,等待节点重新创建后再打开。

本 BSP 的停止流程也可能读取固件资源表。因此需要在线更换程序时,应先停止 E907,再替换固件文件,最后启动;不要在远端运行期间换成资源表不兼容的镜像后直接执行 stop。第 5.3 节的文件替换加整机重启方式用于常规升级。


6.5 可选 RPMsg 控制台

物理 UART 日志关闭不影响通过 RPMsg 调用 E907 CLI。E907 工程已配置 CONFIG_MULTI_CONSOLE、CONFIG_RPMSG_MULTI_CONSOLE 和 CONFIG_RPMSG_CLIENT。Linux 侧使用 SDK 的 amp_shell 客户端。

amp_shell 不在基础评估镜像的默认安装列表中。需要交互执行外设例程时,在开发主机为对应项目启用下列 Buildroot 选项:

BR2_PACKAGE_RPMSG=yBR2_PACKAGE_AMP_SHELL=y

配置与生成固件:

cd /data/tina5.0-t153./build.sh buildroot_menuconfig./build.sh buildroot_saveconfig./build.sh rootfs./build.sh pack

菜单中按 / 搜索 BR2_PACKAGE_AMP_SHELL,同时启用其 RPMSG 依赖;保存的配置应纳入对应项目的 Buildroot defconfig。为另一存储版本启用时,先切换板型,再执行上述配置流程。

更新对应完整固件并启动 E907 后,在板端 Linux 执行:

ls -l /dev/rpmsg_ctrl*amp_shell

根据客户端列出的控制器选择 E907 对应项,再在远端控制台执行 help。也可先用 amp_shell -h 查看参数,通过 -d 指定实际存在的控制设备;控制设备名以板端枚举结果为准。

输入位置
命令示例
执行对象
Linux Shell
hd-rpmsg-test 100 128 1000
Linux 与 E907 请求应答测试
E907 控制台
help、free、timer_set_periodic_test
E907 CLI 及已编入的 HAL 例程

不要将 E907 命令直接输入 Linux Shell,也不要将 hd-rpmsg-test 当作 E907 命令。共享日志用于观察运行信息,不是命令输入接口。性能测量时退出控制台,避免命令输出和测试线程额外影响时延。


07


RPMsg 通信与实时性测试



7.1 单轮测试

hd-rpmsg-test 100 128 1000hd-rpmsg-test 10000 128 0hd-rpmsg-test 10000 440 0

参数依次为请求数、测试报文长度、相邻请求间隔:

参数
范围
单位
请求数
1~10000
个
测试报文长度
32~440,含测试协议字段
字节
请求间隔
0~1000000
微秒


间隔为 0 表示收到上一条响应后立即发送下一条,仍属于单请求往返测试,不是多消息并发吞吐测试。440 字节是本测试协议限制,不代表 RPMsg 所有应用的最大有效载荷。


7.2 指标说明

指标
含义
A7 send total
Linux 侧发送调用耗时
E907 pre-reply
E907 回调进入至开始回复前的处理耗时
round trip
Linux 发送请求至收到响应的往返耗时
Linux RX dispatch wait
Linux 接收通知至接收线程处理的等待时间
Linux RX to callback
Linux 接收处理至测试回调的耗时
E907 IRQ to callback
E907 消息中断至应用回调的耗时
E907 rpmsg_send total
E907 回复发送调用耗时


完整诊断输出还包含发送排队、FIFO 写入及回复路径分段。A7 本地统计使用 ktime,跨核路径使用共享 24 MHz 计数器;不得直接相减两个不同时间源的值。

min、avg、p95、p99、max 均以微秒输出。检查收发错误、超时、失败数为 0,诊断覆盖率完整,尾探针为 OK。需要定位异常时结合最慢报文的分段数据,不应把 RTT 除以二作为实测单向接收时延。

7.3 连续与业务负载测试

先完成第 6.2 节的 debugfs 挂载。空载与 CPU 压力对照:

hd-rpmsg-stress-test all 5 10000 0

业务组合负载包含网络双向收发、介质同步读写校验和显示刷新。PC 先启动:

iperf3 -s

板端确认网络可达,TF 卡已挂载、可写且剩余空间至少 32 MiB,再执行:

HD_BUSINESS_IPERF_SERVER=192.168.1.11 \HD_BUSINESS_STORAGE_DIR=/mnt/tf \hd-rpmsg-stress-test business 1 1000 0

短测成功后,将末尾参数改为 20 10000 0。IP 地址、存储目录必须按实际环境设置,不能把 /tmp 当作真实存储负载。显示测试会临时绘制画面,存储测试产生实际闪存写入。

输出目录为 /tmp/hd-rpmsg-test.XXXXXX,保留 summary.tsv、summary.txt、各轮日志、E907 trace 及业务负载日志。汇总中的 P99 为逐轮 P99 的最大值,不是合并全部样本重新计算的分位数。

测试工具支持通过 HD_RPMSG_CPU_MASK 和 HD_RPMSG_FIFO_PRIORITY 设置发送进程的绑核及调度策略。例如掩码 4 表示 CPU2,FIFO 优先级 20。此设置不等同于修改内核消息接收线程,也不构成实时性能保证。调度对照应使用配套测试脚本,并保留原配置。


分享
下一篇:这是最后一篇
上一篇:这是第一篇