【Semidrive】G9 平台如何使用 R 核与 A 核的核间通信功能

关键字 :SemidriveautoG9X
本篇博文介绍如何在 G9 平台使用 R 核与 A 核的核间通信功能,软件版本是 G9 PTG5.0,硬件环境是 G9X 平台。在看本篇文章前需要对 Semidrive 的核间通信原理有基本了解。

一、核间通信应用简介

通信服务的主要方式是在通信的两端各自打开 Endpoint 实例。
首先,在 RTOS 端,通过接口获得与某一个对端处理器通信的 IPCC 设备实例
其次,创建通信通道,使用者需要针对具体应用场景申请唯一的 Endpoint 编号,一个 16 位无符号
整数,范围是 0~65535。一般来说,同一个应用或者服务在不同操作系统使用时,可以相同Endpoint
编号,因为操作系统所在的处理器不是同一个。0~255 范围是预留给芯驰自有服务使用。

1. 下面以在 Freertos 创建一个普通的 RPMSG Channel 通信为例:
1)申请发送和接收buffer

char txbuf[RPMSG_MTU_BYTES];
char rxbuf[RPMSG_MTU_BYTES];

2)创建 rpmsg channel,指定远端的处理器(rproc)、endpoint 编号和名称

chan = rpmsg_channel_create(rproc, RPMSG_USER_EPT, RPMSG_USER_EPT_NAME_);

RPMSG_USER_EPT 是指本地服务的 endpoint,RPMSG_USER_EPT_NAME 由用户自定

3)启动 rpmsg channel

rpmsg_channel_start(chan, NULL);

4)发送数据到远端 endpoint

rpmsg_channel_sendto(chan, RPMSG_APP_EPT, txbuf, size, timeout);

RPMSG_APP_EPT:远端的 endpoint
txbuf:需要发送的数据地址,用户请用具体数据的缓冲区替换
size:发送数据的字节长度,不要超过 MTU
timeout:发送等待的超时时间,超时可能是远端设备异常等原因。
前文提到为了节约 R5 上的内存使用,rpmsg、ipcc channel 默认的 MTU 为 DCF_MSG_MAX_LEN(128)字节

5)接收数据

ret = rpmsg_channel_recvfrom(chan, &src, rxbuf, size, &recved, timeout);

src:返回来自远端的endpoint 值
rxbuf:接收缓冲区,用户请用具体数据的缓冲区替换
size:接收缓冲区Rxbuf 字节长度,不要超出Rxbuf 实际内存size,也不要超过MTU
recved:是返回实际接收的数据,小于缓冲区字节长度
timeout:是指最长等待时间。

6)回收 channel 资源

rpmsg_channel_stop(chan);
rpmsg_channel_destroy(chan);


2. 然后 Linux 用户层端按照以下步骤处理:
1) 绑定 rpmsg 字符设备,也就是打开这个rpmsg 管理节点

bind_rpmsg_chrdev("soc:ipcc@0.myendpoint.-1.500");


2) 获得管理字符设备的文件描述符 manfd

manfd= get_rpmsg_chrdev_fd("soc:ipcc@0.myendpoint.-1.500", rpmsg_char_name);

3) 创建 Linux 本地 Endpoint, 比如编号 501 作为 Linux 侧的服务编号,名称为 linux-myendpoint
struct rpmsg_endpoint_info eptinfo;
strcpy(eptinfo.name, "linux-myendpoint");
eptinfo.src = 501;
eptinfo.dst = 0xFFFFFFFF;
ret = rpmsg_create_ept(manfd, &eptinfo);

4) 打开由步骤3 创建出的endpoint 文件名, 而后获得实际的本地Endpoint 设备名称

get_rpmsg_ept_dev_name(rpmsg_char_name, eptinfo.name, ept_dev_name));

5) 根据 ept_dev_name 获得全局路径,使用 open 函数打开文件,既是最终用于数据收发的文件设备。

sprintf(ept_dev_path, "/dev/%s", ept_dev_name);
eptfd = open(ept_dev_path, O_RDWR | O_NONBLOCK );

6) 通过 read 和 write 函数,可以分别读取和发送与这个 Endpoint 有关的数据。

二、参考 demo

1. Freertos 这边的 demo 应用位于 freertos_safetyos\framework\service\samples\main.c,这里需要注意把对端从 AP1 改为 AP2,因为 G9 平台没有 AP1,AP 指的是 AP2.
--- a/service/samples/main.c
+++ b/service/samples/main.c
@@ -48,7 +48,7 @@
* /sys/bus/rpmsg/devices/soc:ipcc@[0|1].[EPT-NAME].-1.[EPT]
* name should be less than 16 bytes
*/
-#define REMOTE_PROCESSOR (DP_CA_AP1)
+#define REMOTE_PROCESSOR (DP_CA_AP2)

2. Linux 这边的 demo 应用位于 recipes-bsp\rpmsg-test\rpmsg-echo-test\src\rpmsg_sample.c,直接编译即可。

3. 首先在 Safety 串口运行 sspd 命令创建 ipcc channel,然后在 AP 串口运行 rpmsg_sample -r ,即可在 A 核接收到来自 R 核的信息。

三、参考文档
1. 《SemiDrive_高性能车载处理器核间通信应用指南_Rev0.6.pdf》

相关视频

【Semidrive】G9 平台如何使用 R 核与 A 核的核间通信功能

本视频主要介绍并测试了 G9X R 核与 A 核进行核间通信的 demo 程序,详细的介绍可以浏览《【Semidrive】G9 平台如何使用 R 核与 A 核的核间通信功能》博文。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论