【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可以实现核间不同,在不同操作系统(域)间传递消息。基于共享内存,因此其通信效率较高。