【Linux】RPMSG通讯协议介绍

RPMSG协议通讯协议介绍

  • RPMSG,全称Remote processor Messaging。是一种核间通讯协议。在Linux Kernel中,已经内置了RPMSG。

  • Linux RPMSG基于共享内存,利用RPMSG可以高效的实现核间通信。比如Linux与FreeRTOS、Linux与Android,都可以使用RPMSG完成域间通信。

  • Linux端 RPMSG架构图(图片摘自网络
    请添加图片描述

  • FreeRTOS端RPMSG架构图(图片摘自网络
    请添加图片描述

RPMSG使用例子

  • RPMSG需要内核支持,Linux Kernel目前已经内置该协议。对于UserSpace,Linux内核提供了RPMSG对应的设备节点
# *表示数字,具体项目中的Driver开出来的节点名不同
# 比如/dev/rpmsg_ctrl0
/dev/rpmsg_ctrl*
  • 用户空间通过ioctl接口,利用/dev/rpmsg_ctrl*节点,可以创建用于通信的端口(Endpoint)。Endpoint创建时,要指定name、src端口、dst端口。

比如:Linux上创建一个端口,name:rpmsg_endpoint123,src:888,dst:666。那么对端(比如FreeRTOS),与之对应,name:rpmsg_endpoint123,src:666,dst:888。
在这里插入图片描述

  • 创建完Endpoint之后,两端便可以使用linux标准的read、write来进行通信交互了。

伪代码:

// 打开控制节点
int fd = open("/dev/rpmsg_ctrl123);

/* struct ss_rpmsg_endpoint_info {
        char name[32];
        __u32 src;
        __u32 dst;
        __u32 id;
        __u32 mode;
    __u16 target_id;
}; */
ss_rpmsg_endpoint_info info;
info.name="rpmsg_endpoint123";
info.src=888;
inof.dst=666;
// 创建Endpoint
// 创建/dev/rpmsg*节点,*是数字,通过info.id获得。
ioctl(fd, SS_RPMSG_CREATE_EPT_IOCTL, &info);

// 打开Endpoint
 char devPath[256];
snprintf(devPath, sizeof(devPath),  "/dev/rpmsg%d", info.id);
int endPd = open(devPath)

// 使用Endpoint发送消息
write(endPd, buf, len);

// 使用Endpoint读取消息
read(endPd, buf,len);

综上,利用RPMSG可以实现核间不同,在不同操作系统(域)间传递消息。基于共享内存,因此其通信效率较高。

04-01
### RPMsg 技术概述 RPMsgLinux 中用于主处理器(Host Processor)和远程处理器(Remote Processor)之间高效通信的一种轻量级消息传递机制。它提供了一种抽象层,使得开发者无需关心底层硬件的具体实现即可完成跨处理器的数据交换[^1]。 #### RPMsg 的核心概念 - **RPMsg 客户端**:每一个 RPMsg 客户端都关联了一个特定的服务名称,并通过该服务名称注册到 RPMsg 框架中。一旦本地服务名与远程发布的服务名匹配成功,则自动创建一条双向通信信道。 - **RPMsg Endpoint**:这是指代具体的消息收发接口点,每一对相互通讯的应用程序都需要定义各自的 endpoint 来发送接收数据包。 #### 实现细节 为了更好地理解其实现方式可以从以下几个方面入手: ##### 一、初始化流程 在系统启动阶段,RPMsg 需要经历一系列配置操作来设置好必要的环境条件以便后续正常运作。例如对于基于 STM32MP1 平台的情况来说,通过对 `stm32mp15xx_m4.ld` 这样的链接脚本的研究可以看出不同类型的代码段会被放置于不同的存储区之中——像 .text 节就被安排进了 SRAM1 ,而 .data 则进入了 SRAM2 。这种布局有助于优化性能并满足实时性需求[^2]。 ##### 二、消息传输机制 当两个设备间建立起有效的连接之后就可以开始互相传送信息了。通常情况下采用的是异步模式下的缓冲区管理策略;即每当有一方准备好了新的待处理项就会立即通知另一侧去读取而不是等待对方查询是否有新资料到达。这样的设计减少了不必要的轮询次数从而提高了整体效率。 另外值得注意的一点是在某些场景下可能还会涉及到事件驱动型的通知体系结构比如文件系统的mount/unmount动作监控等情形。传统方法依赖周期性的扫描 `/proc/mounts` 文件来进行检测不仅耗时而且还容易引发资源争用问题(因为每次访问都会锁定整个命名空间)。相比之下让内核层面直接负责此类变更情况的即时汇报则显得更加合理有效得多[^3]。 ```c // 示例代码展示如何使用 rpmsg API 发送简单字符串消息 #include <linux/rpmsg.h> static struct rpmsg_device *rpdev; void send_message(const char* msg){ int ret; size_t len = strlen(msg); ret = rpmsg_send(rpdev->ept, (void *)msg, len); if(ret != len){ printk(KERN_ERR "Failed to send message\n"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值