核间通信-Linux下RPMsg使用与源码框架分析

目录

1 文档目的

2 相关概念

2.1 术语

2.2 RPMsg相关概念

3 RPMsg核间通信软硬件模块框架

3.1 硬件原理

3.2 软件框架

4 使用RPMsg进行核间通信

4.1 RPMsg通信建立

4.1.1 使用名称服务建立通信

4.1.2 不用名称服务

4.2 RPMsg应用过程

4.3 应用层示例

5 RPMsg内核驱动源码解析

5.1 RPMsg框架源码

5.1.1 源代码与功能

5.1.2 源码分析

5.2 virtio介绍

5.2.1 virtio源码及virtio_queue原理介绍

5.2.2 源码分析

5.3 remoteproc介绍

5.3.1 remoteproc子系统

5.3.2 remoteproc源码解析

5.4 mailbox 框架

5.4.1 mailbox源码介绍

5.4.2 mailbox框架源码解析

6 收发数据流程总结

6.1 接收数据过程调用栈

6.2 发送数据过程调用栈

6.3 收发数据buffer处理过程

6.3.1  J6缓冲区处理流程

6.3.2 stm32-mp157缓冲区处理流程

6.3.3 缓冲区处理

7 附录


1 文档目的

        该文档目的介绍RPMsg基础概念知识、RPMsg整体使用流程,rpmsg、virtio、remotepro、mailbox软件框架、硬件原理相关介绍和RPMsg适配新平台的开发流程,以帮助开发者更好理解RPMsg核间通信框架,进行核间通信开发。

2 相关概念

2.1 术语

        RPMsg: remote processor messages,Linux下用于核间通信顶层框架,面向驱动开发者。

        Virtio: virtual IO,linux平台下一种IO半虚拟化框架。

        Remoteproc: Remote Processor Framework,用于管理异构远程处理器设备,既是一个硬件模块,Linux也实现了对应的remoteproc框架,remoteproc框架允许不同平台或架构控制远程处理器。

        Mailbox:Linux一种软件框架,通过消息队列和中断驱动信号处理多处理器间的通讯,也有人把用于核间通信模块称为mailbox,软件上是个框架,硬件也是个IP。

        MHU:mailbox and handshake uint,是个硬件模块,包含mailbox功能和握手功能,用来确认双方收发情况,减少丢包等。

        IPCC:功能上跟mailbox一样,用于核间通信的硬件IP模块。

2.2 RPMsg相关概念

        RPMsg-Lite 组件: Remote Processor Messaging(RPMsg)协议的一个轻量级实现。

        通道:用于数据传输,通信前需要建立通道,跟实际硬件通道(mailbox/MHU/IPCC)不是同一个概念(后面详细解析),是RPMsg的一样虚拟概念。

        端点:用于核间通信的具体控制点,利用通道进行数据通信。

3 RPMsg核间通信软硬件模块框架

3.1 硬件原理

        RPMsg硬件上依赖mailbox或者MHU(mailbox and handshake uint)和共享内存。基于原理是利用mailbox/MHU模块,触发接收端对应通道中断,接收端收到中断,从共享内存中取出发送放放在共享内存中的数据,如下图:

3.2 软件框架

        RPMsg是在基于虚拟化框架virtio上层实现软件框架,RPMsg总线是一种基于virtio的消息总线。Linux下的RPMsg核间通信,涉及多个Linux内核多个软件框架,包括virtio、remoteproc和mailbox,下图大致描述了各个软件框架在核间通信的关系:

        APP通过调用RPMsg提供的设备来进行核间通信,RPMsg driver向RPMsg bus总线注册driver,同时由virtio和RPMsg的中间适配层RPMsg virtio layer向注册对应device,匹配对应的driver,同时该层又向下注册了virtio driver,将virtio和RPMsg关联起来。Virtio的下层是remoteproc框架,该框架向上注册了virtio device,以和virtio driver匹配向上提供device硬件相关接口(这里硬件接口,包括remoteproc这个IP的接口和下层mailbox接口)。Mailbox框架向外提供client,remoteproce框架同时注册上层了一个mailbox client以和mailbox交互,mailbox向下同时提供了controller,让具体的硬件模块提供硬件操作接口。

        此外,有些软件框架可以脱离其他层单独使用,例如mailbox,驱动开发者可自我注册client生成设备提供APP层直接进行核间通信,remoteproc通过sysfs暴露接口给APP层,用户可以直接控制远端处理器的状态(启动、停止、固件加载等)。而virtio则是一个与硬件无关的框架,可用于其他外设作为数据管理使用。

        最新Linux内核,GLINK和SMD也向RPMsg bus注册了device,这两个协议是用于高通平台,本文不展述。

4 使用RPMsg进行核间通信

        本节从实际使用角度,描述user空间,APP如何使用RPMsg进行核间通信。

4.1 RPMsg通信建立

4.1.1 使用名称服务建立通信

        RPMsg使用前,有时需要建立一定条件,即在使用远端服务时,需要依赖远端发送服务到本地,本地建立服务(即是设备名称)后,user空间app才可打开设备进行通信,如下图是通信建立的大致流程:

        SOC在使用前,需要先收到远端服务请求,在本地建立RPMsg通道、端点和设备等信息,再反馈初始化信息给远端,双方才可进行通信。建立后,APP可主动发送数据,被动收数据或者主动沦陷,最后主动销毁通道。

        在Linux内核代码,服务建立是kernel/drivers/rpmsg/rpmsg_ns.c文件完成,RPMsg device 层向上注册了ns的device,后续章节将深入代码解析该流程。

4.1.2 不用名称服务

        最新的内核代码,也能在不使用名称服务情况下,直接建立端点进行通信,甚至脱离具体RPMsg通道建立端点来通信,这种情况下,需要双方手动登记通信的端点地址,如下图:

        SOC侧在驱动加载时,直接建立通道和端点信息,之后进行正常通信,此时需要手动和远端登记好地址。

        最新内核代码中,drivers/rpmsg/rpmsg_ctrl.c和drivers/rpmsg/rpmsg_char.c都是在不适用名称服务情况下直接进行通信,同时许多其他利用RPMsg框架进行核间通信的模块,都直接使用该方式,例如camera的核间通信等。

4.2 RPMsg应用过程

利用RPMsg核间通信过程:建立通道和端点同时绑定本地地址和远端地址,发送时带上本地地址,远端发送数据到本地时,也需要携带远端地址才能被本地端点使用,上送数据给应用层。

比较典型的应用,是一个通道两端各一个端点进行通信:

还可以一个通道多个端点

或者多通道多端点

4.3 应用层示例

        在底层准备好后,应用层就能打开底层提供的设备进行核间通信。以/dev/rpmsg_ctrl0设备为例子,就是4.1.2提到的drivers/rpmsg/rpmsg_ctrl.c生成的设备,该RPMsg驱动支持生成多端点进行通信或者多通道,下面应用程序是使用流程:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdint.h>
#include "sstar_rpmsg.h"
int main(void)
{
    struct ss_rpmsg_endpoint_info info;
    char buffer[512];
    char data[512];
    int ret;
    char devPath[256];
    int fd, eptFd;
    unsigned int index = 0x0;
    memset(&info, 0, sizeof(info));
    info.src = EPT_ADDR_MACRO(EPT_TYPE_CUSTOMER, 1);
    info.dst = EPT_ADDR_MACRO(EPT_TYPE_CUSTOMER, 2);
    snprintf(info.name, sizeof(info.name), "demo");
    info.mode = RPMSG_MODE_RISCV;
    info.target_id = 0;
    fd = open("/dev/rpmsg_ctrl0", O_RDWR);
    if (fd < 0)
    {
        perror("open");
        return 0;
    }
    if (ioctl(fd, SS_RPMSG_CREATE_EPT_IOCTL, &info) < 0)//创建通道时携带端点地址
    {
        perror("ioctl");
        return 0;
    }
    sleep(2);
    snprintf(devPath, sizeof(devPath),  "/dev/rpmsg%d", info.id);//打开创建端点时生成的设备
    eptFd = open(devPath, O_RDWR);
    if (eptFd < 0)
    {
        fprintf(stderr, "Failed to open endpoint!\n");
        return 0;
    }
    while (1)
    {
        snprintf(buffer, sizeof(buffer), "hello,world:0x%x\n", index++);
        ret = write(eptFd, buffer, strlen(buffer) + 1);//写数据
        memset(data, 0, sizeof(data));
        ret = read(eptFd, data, sizeof(data));//读数据
        if (ret > 0)
            printf("read ept:%d, %s\n", ret, data);
        else
            printf("read ept error:%d\n", ret);
    }
    return 0;
}

使用由rpmsg_ctrl.c注册生产的设备来使用rpmsg进行核间通信;先用/dev/rpmsg_ctrl0 设备通过ioctrl生成端点SS_RPMSG_CREATE_EPT_IOCT ,此时驱动将为进程生成/dev/rpmsgX 设备用来核间通信使用,后续可以使用常用的文件操作方式访问该设备进行核间通信。

  • "/dev/rpmg_ctrl0" to instantiate /dev/rpmsg0 sysfs device interface,
  • "/dev/rpmg0" sysfs device interface for communication.

在后面章节,将介绍分析驱动如何提供接口给应用层。

5 RPMsg内核驱动源码解析

        RPMsg内核驱动框架涉及到RPMsg框架、virtio框架、remoteproc子系统和mailbox子系统,下面逐一介绍这些框架。

5.1 RPMsg框架源码

5.1.1 源代码与功能

        RPMsg源码位于Linux源码目录kernel/drivers/rpmsg/下,下图是一个RPMsg大致软件功能框图,主要涉及源文件为:<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476916.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用Adb 命令

# 连接设备 adb connect 192.168.10.125# 断开连接 adb disconnect 192.168.10.125# 查看已连接的设备 adb devices# 安装webview adb install -r "D:\webview\com.google.android.webview_103.0.5060.129-506012903_minAPI23(arm64-v8a,armeabi-v7a)(nodpi)_apkmirror.co…

高质量代理池go_Proxy_Pool

高质量代理池go_Proxy_Pool 声明&#xff01; 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以…

有关博客博客系统的测试报告 --- 初次进行项目测试篇

文章目录 前言一、博客系统的项目背景二、博客系统的项目简介1.后端功能1.1 用户管理1.2 博客管理1.3 权限管理 2.前端功能2.1 用户界面 测试计划测试工具、环境设计的测试动作功能测试访问博客登录页面博客首页测试博客详情页博客编辑页 自动化测试自动化测试用例自动化测试脚…

物业管理系统的设计和实现

一、项目背景 物业管理系统在现代城市化进程中起着至关重要的作用。 随着居民生活水平的提高和信息技术的迅猛发展&#xff0c;传统的物业管理模式已不能满足业主和管理者的需求。 为了提高管理效率、降低运营成本、提升服务质量&#xff0c;设计并实现一个集成化、智能化的物业…

JDBC编程---Java

目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源&#xff0c;并设置数据库所在的位置&#xff0c;三条固定写法 2.建立和数据库服务器之间的连接&#xff0c;连接好了后&#xff…

快速图像识别:落叶植物叶片分类

1.背景意义 研究背景与意义 随着全球生态环境的变化&#xff0c;植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础&#xff0c;也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…

数字化那点事:一文读懂物联网

一、物联网是什么&#xff1f; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过网络将各种物理设备连接起来&#xff0c;使它们可以互相通信并进行数据交换的技术系统。通过在物理对象中嵌入传感器、处理器、通信模块等硬件&#xff0c;IoT将“…

IntelliJ+SpringBoot项目实战(十)--常量类、自定义错误页、全局异常处理

一、常量类 在项目开发中&#xff0c;经常需要约定一些常量&#xff0c;比如接口返回响应请求指定状态码、异常类型、默认页数等&#xff0c;为了增加代码的可阅读性以及开发团队中规范一些常量的使用&#xff0c;可开发一些常量类。下面有3个常量类示例&#xff0c;代码位于op…

ubuntu20.04的arduino+MU编辑器安装教程

arduino 按照这个博客&#xff0c;是2.3版本的&#xff1a; Ubuntu20.04/22.04 安装 Arduino IDE 2.x_ubuntu ide-CSDN博客https://blog.csdn.net/michaelchain/article/details/128744935以下这个博客是1.8版本的 在ubuntu系统安装Arduino IDE的方法_ubuntu arduino ide-CS…

Docker核心概念总结

本文只是对 Docker 的概念做了较为详细的介绍&#xff0c;并不涉及一些像 Docker 环境的安装以及 Docker 的一些常见操作和命令。 容器介绍 Docker 是世界领先的软件容器平台&#xff0c;所以想要搞懂 Docker 的概念我们必须先从容器开始说起。 什么是容器? 先来看看容器较为…

Redis ⽀持哪⼏种数据类型?适⽤场景,底层结构

目录 Redis 数据类型 一、String&#xff08;字符串&#xff09; 二、Hash&#xff08;哈希&#xff09; 三、List&#xff08;列表&#xff09; 四、Set&#xff08;集合&#xff09; 五、ZSet(sorted set&#xff1a;有序集合) 六、BitMap 七、HyperLogLog 八、GEO …

uniapp接入BMapGL百度地图

下面代码兼容安卓APP和H5 百度地图官网&#xff1a;控制台 | 百度地图开放平台 应用类别选择《浏览器端》 /utils/map.js 需要设置你自己的key export function myBMapGL1() {return new Promise(function(resolve, reject) {if (typeof window.initMyBMapGL1 function) {r…

Docker+Nginx | Docker(Nginx) + Docker(fastapi)反向代理

在DockerHub搜 nginx&#xff0c;第一个就是官方镜像库&#xff0c;这里使用1.27.2版本演示 1.下载镜像 docker pull nginx:1.27.2 2.测试运行 docker run --name nginx -p 9090:80 -d nginx:1.27.2 这里绑定了宿主机的9090端口&#xff0c;只要访问宿主机的9090端口&#…

AmazonS3集成minio实现https访问

最近系统全面升级到https&#xff0c;之前AmazonS3大文件分片上传直接使用http://ip:9000访问minio的方式已然行不通&#xff0c;https服务器访问http资源会报Mixed Content混合内容错误。 一般有两种解决方案&#xff0c;一是升级minio服务&#xff0c;配置ssl证书&#xff0c…

人工智能|计算机视觉——微表情识别(Micro expression recognition)的研究现状

一、简述 微表情是一种特殊的面部表情,与普通的表情相比,微表情主要有以下特点: 持续时间短,通常只有1/25s~1/3s;动作强度低,难以察觉;在无意识状态下产生,通常难以掩饰或伪装;对微表情的分析通常需要在视频中,而普通表情在图像中就可以分析。由于微表情在无意识状态…

2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

一、单选题 1、下面代码运行后出现的图像是&#xff1f;&#xff08; &#xff09; import matplotlib.pyplot as plt import numpy as np x np.array([A, B, C, D]) y np.array([30, 25, 15, 35]) plt.bar(x, y) plt.show() A. B. C. D. 正确答案&#xff1a;A 答案…

Spring Aop+自定义注解实践(待完善日志)

目录 前言 1.引入依赖 2.SpringAop的用法举例 3. 自定义注解AOP的用法举例 3.1 关于Target注解补充 3.2 关于Retention注解补充 3.3 举例 前言 如果你不太理解aop的知识&#xff0c;请看我写的这篇文章&#xff0c;非常详细&#xff1a; Spring AOP&#xff08;定义、…

OpenCV双目立体视觉重建

本篇文章主要给出使用opencv sgbm重建三维点云的代码&#xff0c;鉴于自身水平所限&#xff0c;如有错误&#xff0c;欢迎批评指正。 环境&#xff1a;vs2015 &#xff0c;opencv3.4.6&#xff0c;pcl1.8.0 原始数据使用D455采集&#xff0c;图像已做完立体校正&#xff0c;如下…

【进阶系列】python简单爬虫实例

python有一个很强大的功能就是爬取网页的信息&#xff0c;这里是CNBlogs 网站&#xff0c;我们将以此网站为实例&#xff0c;爬取指定个页面的大标题内容。代码如下&#xff1a; 首先是导入库&#xff1a; # 导入所需的库 import requests # 用于发送HTTP请求 from bs4 impor…

Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析

1. 产品定位 Ease Monitor 有如下的产品定位&#xff1a; 关注于整体应用的SLA。 主要从为用户服务的 API 来监控整个系统。 关联指标聚合。 把有关联的系统及其指示聚合展示。主要是三层系统数据&#xff1a;基础层、平台中间件层和应用层。 快速故障定位。 对于现有的系统…