前 言
本文档主要介绍T113-i处理器的ARM + DSP、RISC-V核间通信开发案例,演示T113-i处理器ARM Cortex-A7与HiFi4 DSP核心、玄铁C906 RISC-V核心的核间通信。适用开发环境如下:
Windows开发环境:Windows 7 64bit、Windows 10 64bit
虚拟机:VMware15.5.5
Linux开发环境:Ubuntu18.04.4 64bit
U-Boot:U-Boot-2018.07
Kernel:Linux-5.4.61
LinuxSDK:T113_Tina5.0-V1.0(Linux)
T113-i处理器支持Linux(Kernel-5.4.61)、HiFi4 DSP、玄铁C906 RISC-V组合的OpenAMP架构设计,可满足如工业HMI、工业PLC、物联网网关、机器人示教器、户用储能EMS/BMS、汽车充电桩的需求。
我司提供的ARM + DSP、RISC-V核间通信开发案例位于产品资料“4-软件资料\Demo\platform-demos\rpmsg_echo\”目录下,案例目录说明如下表所示,其中bin目录存放程序可执行文件,src目录存放案例工程源文件。
备注:
- 无特殊说明情况下,本文默认使用NAND FLASH配置评估板,默认从Linux系统启动卡启动系统(SD启动模式)进行测试。
- Linux系统默认会初始化相关外设,不影响案例测试。
- 本文默认使用评估板USB TO UART0串口作为ARM端调试串口,RS232 UART2串口作为HiFi4 DSP/RISC-V核心调试串口,请使用Type-C线连接PC机和评估板的USB TO UART0串口,使用RS232交叉串口母母线、USB转RS232公头串口线,将评估板的RS232 UART2串口连接至PC机的USB接口,如下图所示。
图 1
rpmsg_echo案例
案例功能
案例主要使用RPMsg框架来实现异构的处理器之间进行相互通信。ARM Cortex-A7核心运行Linux系统与rpmsg_echo应用程序,HiFi4 DSP/RISC-V核心运行HiFi4 DSP/RISC-V程序,实现ARM端的rpmsg数据的接收与发送功能。
案例程序流程图如下:
图 2
程序原理说明:
- HiFi4 DSP/RISC-V等待接收ARM端的rpmsg数据;
- ARM端的rpmsg_echo应用程序发送rpmsg数据至HiFi4 DSP/RISC-V;
- 当HiFi4 DSP/RISC-V端接收到ARM端的rpmsg数据后会将数据发送回ARM端;
- ARM端将接收来自HiFi4 DSP/RISC-V的rpmsg数据;
- ARM端程序与HiFi4 DSP/RISC-V程序之间循环往复接收与发送rpmsg数据,实现核间通信。
案例测试
将评估板上电启动,在U-Boot倒计时结束之前按下空格键进入U-Boot命令行模式,执行如下命令关闭设备树UART2配置,避免Linux内核占用案例的外设资源。
U-Boot# fdt set /soc/uart@2500800 status disabled
U-Boot# boot
图 3
1.ARM Cortex-A7与HiFi4 DSP核心通信
将本案例"dsp\bin\"目录下的可执行文件amp_dsp0.bin拷贝至评估板系统的"/lib/firmware/"目录下,执行如下命令,启动HiFi4 DSP核心并加载工程镜像。
Target# echo amp_dsp0.bin > /sys/class/remoteproc/remoteproc0/firmware //指定加载的工程镜像
Target# echo start > /sys/class/remoteproc/remoteproc0/state //启用HiFi4 DSP核心并加载工程镜像
图 4
HiFi4 DSP核心启动后将自动运行程序,RS232 UART2串口终端将会打印如下类似信息。
图 5
将案例"arm\bin\"目录下的应用程序rpmsg_echo拷贝至评估板文件系统,执行如下命令查看程序参数信息。
Target# ./rpmsg_echo -h
参数解析:
-r <remoteproc_process_name>:rpmsg的控制节点;
-m <message>:发送的信息;
-n <num_msgs>:表示发送rpmsg数据包次数。
图 6
执行如下命令运行ARM端应用程序,发送5次rpmsg数据包至HiFi4 DSP核心,当HiFi4 DSP核心每收到1次rpmsg数据包就会将数据包发送回ARM端。
Target# ./rpmsg_echo -r dsp_rproc@0 -m tronlong -n 5
图 7
当ARM端程序运行时,RS232 UART2串口终端将会打印如下类似信息。
图 8
执行如下命令,关闭HiFi4 DSP核心,程序将停止运行。同时RS232 UART2调试串口终端会打印如下类似信息。
Target# echo stop > /sys/class/remoteproc/remoteproc0/state
图 9
图 10
2.ARM Cortex-A7与RISC-V核心通信
将本案例"risc-v\bin\"目录下的可执行文件amp_rv0.bin拷贝至评估板系统的"/lib/firmware/"目录下,执行如下命令,启动RISC-V核心并加载工程镜像。
Target# echo amp_rv0.bin > /sys/class/remoteproc/remoteproc1/firmware //指定加载的工程镜像
Target# echo start > /sys/class/remoteproc/remoteproc1/state //启用HiFi4 DSP核心并加载工程镜像
图 11
RISC-V核心启动后将自动运行程序,RS232 UART2串口终端将会打印如下类似信息。
图 12
将案例"arm\bin\"目录下的应用程序rpmsg_echo拷贝至评估板文件系统,执行如下命令查看程序参数信息。
Target# ./rpmsg_echo -h
参数解析:
-r <remoteproc_process_name>:rpmsg的控制节点;
-m <message>:发送的信息;
-n <num_msgs>:表示发送rpmsg数据包的次数。
图 13
执行如下命令运行ARM端应用程序,发送5次rpmsg数据包至RISC-V核心,当RISC-V核心每收到1次rpmsg数据包就会将数据包发送回ARM端。
Target# ./rpmsg_echo -r c906_rproc\@0 -m tronlong -n 5
图 14
当ARM端程序运行时,RS232 UART2串口终端将会打印如下类似信息。
图 15
执行如下命令,关闭RISC-V核心,程序将停止运行。
Target# echo stop > /sys/class/remoteproc/remoteproc1/state
图 16
图 17
案例编译
请将产品资料“4-软件资料\Demo\platform-demos\rpmsg_echo\”案例目录下的arm、dsp和risc-v目录的源码拷贝至Ubuntu工作目录。
1.ARM程序
进入案例应用程序源码目录,执行如下命令,配置应用程序交叉编译工具链环境变量,然后进行编译,编译完成将会在当前目录下生成rpmsg_echo可执行程序。
备注:若为eMMC配置评估板,请将路径"tlt113-evm-nand"修改为"tlt113-evm-emmc"。
Host# CC=/home/tronlong/T113/tina5.0_v1.0/out/t113_i/tlt113-evm-nand/buildroot/buildroot/host/bin/arm-linux-gnueabi-gcc make
图 18
1.RISC-V程序
请根据《RISC-V案例开发手册》的工程编译、程序固化步骤生成工程镜像。
2.HiFi4 DSP程序
请根据《DSP案例开发手册》的工程编译、程序固化步骤生成工程镜像。
关键代码
1.ARM
main.c文件位于案例"rpmsg_echo\arm\src\"目录下。
创建并打开rpmsg端点。
图 19
通过rpmsg发送数据。
通过rpmsg接收数据。
图 21
关闭rpmsg端点
图 22
2.HiFi4 DSP
main.c文件位于案例"rpmsg_echo\dsp\src\"目录下。
创建任务并开始任务调度。
图 23
初始化msgbox和openamp,并创建rpmsg控制器和端点。
图 24
拷贝数据至信息队列。
图 25
申请内存,创建并开启rpmsg_echo_thread线程。
图 26
标记线程停止标志,释放内存。
图 27
3.RISC-V
main.c文件位于案例"rpmsg_echo\risc-v\src\"目录下。
初始化openamp,并创建rpmsg控制器和端点。
图 28
拷贝数据至信息队列。
图 29
申请内存,创建并开启rpmsg_echo_thread线程。
图 30
标记线程停止标志,释放内存。
图 31