一、eRPC 是什么、为什么要用在 HPM6E80 上
eRPC(Embedded Remote Procedure Call)是一个简单、易用、高效的远程调用框架。Client 端通过简单的本地函数调用,就能使用 Server 端提供的服务;调用时函数的标识和参数被序列化成字节流,经传输层通道(IPC、TCP/IP、UART、SPI 等)发到 Server 端,Server 解析参数并执行对应服务函数,有返回值时再序列化回传。
HPM6E80 是双 RISC-V 内核、主频 600MHz 的高性能 MCU,双核应用场景下正好需要一套跨核调用机制。HPM 的 eRPC 主要用于**多核(MultiCore)**场景,传输层用 RPMsg-Lite;跨芯片(MultiProcessor)场景则改用 UART、SPI、TCP/IP 等作为传输通道。
二、HPM 平台上的技术组合
HPM-SDK 已经完成了 eRPC 的移植,具体配置为:
- 传输层:RPMsg-Lite(Remote Processor Messaging Lite),定义标准化二进制接口用于多核间通信,底层采用共享内存 + 消息通知
- 事件通知:MBX(通信信箱)
- 例程位置 :
hpm_sdk\samples\multicore\erpc
SDK 的 eRPC 例程(bare metal 版本)说明:本项目执行 eRPC 示例,使用 RPMSG 作为传输层协议、MBX 作为消息通知,Core0 作为 Client,Core1 作为 Server;当前基于 erpc v1.10.0 和 rpmsg-lite v5.0.0 开发
。
三、具体应用步骤(以 SDK 的 matrix_multiply 例程为例)
1. 编写 IDL 接口文件
IDL 文件包含 eRPC 调用中用到的全部声明。例程的 erpc_matrix_multiply.erpc 定义了输出目录、常量、数据类型和服务接口:
@outputDir("erpc_outputs")
program erpc_matrix_multiply;
const int32 matrix_size = 5;
type Matrix = int32[matrix_size][matrix_size];
interface MatrixMultiplyService
{
erpcMatrixMultiply(in Matrix matrix1, in Matrix matrix2, out Matrix result_matrix) -> void
oneway erpcSwitchLightLed()
}
IDL 语法的详细说明参考 middleware/erpc/erpc/docs/IDL-Reference.md。
2. 用 erpcgen 生成代码
最简便的方式是把工具和 IDL 文件放在同一目录下,然后执行:
../../../../../middleware/erpc/erpc/tools/erpcgen/Windows/erpcgen.exe erpc_matrix_multiply.erpc
生成四个文件:erpc_matrix_multiply.h、erpc_matrix_multiply_client.cpp、erpc_matrix_multiply_server.h、erpc_matrix_multiply_server.cpp。
3. 把生成文件加入两个核的工程
- Client 工程(Core0) :需要
erpc_matrix_multiply.h和erpc_matrix_multiply_client.cpp,在调用 eRPC 函数的源文件中 include 头文件 - Server 工程(Core1) :需要
erpc_matrix_multiply.h、erpc_matrix_multiply_server.h和erpc_matrix_multiply_server.cpp,在实现 eRPC 服务函数的源文件中 include 服务头文件
4. 编译、运行与调试多核工程
按 SDK 的 Multicore General Description 说明进行工程生成、编译和调试。运行时主核(Core0)会先把从核镜像拷贝到目标内存、启动从核;串口终端会依次输出 "Primary core started"、"Secondary core started..."、两个矩阵、eRPC 请求已发送到 server、结果矩阵等;按下 PBUTN 按键可发起下一次矩阵乘法,红/绿 LED 会翻转。
四、使用 eRPC 时需要遵守的双核协作要点
eRPC 依赖共享内存和核间中断,因此必须配合 HPM 双核的资源分配规则:
- 共享 RAM:双核下的共享 RAM 区域地址及大小必须相同;为避免 cache 影响,共享区域在两个核中都要设为 nocache,或在访问前后强制刷新 cache;若设为 nocache,Core0 和 Core1 中都要调用初始化 PMP
- RAM 划分:除共享 RAM 和各自私有的 ILM/DLM 外,其余 SRAM/SDRAM 在双核中的分配不可重叠
- 外设访问:通常应避免双核访问同一外设;如必须,禁止双核均初始化同一外设,并配合 MBX 实现双核互斥锁防止并发操作
- 中断:双核各自的 PLIC 是私有的,若双核都使能同一外设中断,需要在两个 PLIC 中都使能;中断标志位只在一侧清除
- 主从架构:Core0 为主、Core1 为从;复位时系统总是由 Core0 启动,Core1 处于待机状态,由 Core0 装载启动。Core0 异常重启会带动 Core1 重启,Core1 异常重启不影响 Core0
- Flash 访问:避免双核并发访问同一 Flash,可结合 MBX 实现互斥锁,并在访问前后禁止/使能全局中断
五、注意事项与信息边界
- eRPC 适合把跨核/跨芯片的交互封装成函数调用,简化系统集成;它不是大批量数据搬运通道,高频、大批量数据仍应走共享内存或 DMA
- 上述步骤与例程路径(
samples/multicore/erpc、matrix_multiply 例程)来自 HPM SDK 的通用多核 eRPC 文档与先楫官方双核介绍;HPM6E80 属于同一 SDK 支持范围(hpm_sdk v1.6.0 起新增该产品支持),但公开资料中的例程运行输出是以 HPM6750EVKMINI 为例。在 HPM6E80 上使用时,具体板级引脚、RMII/RGMII 等配置需按 HPM6E00EVK 及实际工程自行确认。