ERPC 在 HPM6E80 MCU 中的应用方法

一、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 双核的资源分配规则:

  1. 共享 RAM:双核下的共享 RAM 区域地址及大小必须相同;为避免 cache 影响,共享区域在两个核中都要设为 nocache,或在访问前后强制刷新 cache;若设为 nocache,Core0 和 Core1 中都要调用初始化 PMP
  2. RAM 划分:除共享 RAM 和各自私有的 ILM/DLM 外,其余 SRAM/SDRAM 在双核中的分配不可重叠
  3. 外设访问:通常应避免双核访问同一外设;如必须,禁止双核均初始化同一外设,并配合 MBX 实现双核互斥锁防止并发操作
  4. 中断:双核各自的 PLIC 是私有的,若双核都使能同一外设中断,需要在两个 PLIC 中都使能;中断标志位只在一侧清除
  5. 主从架构:Core0 为主、Core1 为从;复位时系统总是由 Core0 启动,Core1 处于待机状态,由 Core0 装载启动。Core0 异常重启会带动 Core1 重启,Core1 异常重启不影响 Core0
  6. 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 及实际工程自行确认。
相关推荐
花 满 楼13 天前
RTA-OS 任务调度机制深度拆解:从 alarm 到期到任务切换的全链路(PowerPC e200)
os·嵌入式软件·汽车电子
怀民民民1 个月前
嵌入式软件学习路线与项目实践记录:STM32、FreeRTOS、Linux 与 OpenMV
stm32·freertos·嵌入式软件·嵌入式linux·openmv
youcans_2 个月前
【嵌入式软件AI编程】12. Claude Code的基本操作
stm32·单片机·ai编程·嵌入式软件·claude code
youcans_2 个月前
【嵌入式软件AI编程】09. 使用VS Code调试STM32程序
stm32·mcu·ai编程·嵌入式软件·claude code
youcans_2 个月前
【嵌入式软件AI编程】08. 第一个STM32工程
stm32·单片机·ai编程·嵌入式软件·claude code
老猿讲编程2 个月前
【Eclipse OpenSOVD学习之十】客户端 SDK
学习·eclipse·嵌入式软件·车载·sovd
泛联新安2 个月前
FPGA功能仿真:VShark正式亮相,换仿真器不用换习惯
fpga开发·编译·仿真·嵌入式软件·代码漏洞扫描
老猿讲编程2 个月前
【Eclipse OpenSOVD学习之六】 数据访问层(DataProvider)
学习·eclipse·嵌入式软件·车载·sovd
泛联新安2 个月前
FPGA仿真加速:AccEmu正式亮相,一周的回归,一天跑完
机器学习·fpga开发·数据挖掘·回归·自动化·嵌入式软件·代码漏洞扫描