首页 > 系统相关 >核间通信:Linux中RPMsg和OpenAMP详解

核间通信:Linux中RPMsg和OpenAMP详解

时间:2024-05-28 10:59:16浏览次数:30  
标签:RPMsg 间通信 处理器 Linux 组件 OpenAMP

1. 核间通信组件简介

 目前针对不同级别的操作系统,存在几种核间通信组件,分别是以Linux内嵌组件RPMsg、支持跨平台移植的OpenAMP,短小精简的RPMsg-Lite,这三个组件在代码细节、收发策略、移植性上各有优劣,用户可根据需要选择。它们起初都来源于Linux的RPMsg,遵循统一的协议标准(交互过程,内存格式),主要依赖硬件的共享内存和核间中断。和TCP/IP层次结构类似,按照ISO/OSI的层次化结构模型,三个核间通信组件均可分为三层,如下图所示。

 

 

1.1 RPMsg(Linux)

在AMP系统中,不同的内核协作的最常见的方式是使用共享内存通信,这样方式效率最高,其中有许多系统自定义的实现,单这也导致不同系统之间不能互联。为了解决这个问题,TI(德州仪器)在Linux内核中提供了remoteproc 和 RPMsg 基础设施使在主处理器上运行的 Linux 应用程序能够管理远程处理器/固件的生命周期,并使用它们执行 IPC。

1.1 OpenAMP(RTOS)

OpenAMP框架包含提供了三个重要组件:Virtio、RPMsg和Remoteproc。Remoteproc实现了主处理器对远程处理器程序的加载、启停远程处理器,实现对远程处理器的生命周期管理;RPMsg依托Virtio实现了主处理器和远程处理器之间的核间通信。

1.1 RPMsg-Lite(BareMetal)

RPMsg-Lite组件是远程处理器消息传递 (RPMsg) 协议的轻量级实现。RPMsg 协议定义了一个标准化的二进制接口,用于在异构多核系统中的多个核之间进行通信。与开放非对称多处理 (OpenAMP) 框架的 RPMsg 实现相比,RPMsg-Lite 减少了代码大小、简化了 API 并改进了模块化。在较小的基于  的系统上,比如裸机系统,建议使用 RPMsg-Lite。RPMsg-Lite 是由 NXP Semiconductors 开发的开源组件,并在 BSD 兼容许可下发布。

2. 核间通信组件的作用

2.1 共享内存缓冲队列管理

对于核间通信来说,两个CPU核同时访问同一个共享内存,如何实现同步实现资源互斥访问是一个需要重点考虑的问题,这里就使用的是数据链路层的virtIO来实现的,详见RPMSG详解-VirtIO。

2.2 多通道、多端点管理

对于异构多核的SOC来说,存在多个CPU核,一个CPU主核可能需要同时和多个CPU从核进行核间通信,因此需要对多个CPU核进行管理通道管理。

对于一个CPU核来说,可能需要运行不同的应用,每个应用需要通信的数据长度,实时性等均存在不同需求,因此需要在通道的管理上再增加端点的管理,类似同一个网卡可以使用不同的端点号建立多个UDP链接,方便应用使用。这部分主要由传输层的RPMsg实现,详见RPMSG详解-RPMsg。

因涉密原因,在此不叙述具体的核间通信设计方案,以下只说明性能优化上需要注意的要点,因为这部分在网上还没有一个博主进行过详细说明。

3. 性能优化

 

3.1 接收性能

接收性能的主要耗时是共享内存到内核缓冲的数据拷贝,Linux中的VirtIO模块仅支持对vring_buf进行cache flush操作,对于buf的描述结构体vring_rx和vring_tx是需要配置为uncache属性的,这也是imx和zynq的RPMsg参考代码都是使用的uncache的方式初始化共享内存(但是这种方式的性能差很多),因此最优的做法应该是将共享内存的空间分为描述符和buf两段,前者设置为uncache属性,后者设置为cache属性,并开启IOMMU。经过实际性能对比测试,性能可提升6倍。

 

 3.1 发送性能

Linux和OpenAMP的发送阻塞策略不一样,Linux的策略是等到event唤醒线程或者15秒超时唤醒;而OpenAMP的策略是固定睡眠1ms后唤醒线程检查是否有数据需要发送。

因此Linux发送的时候,如果RTOS没有及时读取,很容易在发送一段时间后出现Linux发送进程睡眠而导致发生性能骤降甚至停止,解决的方法是要在RTOS中增加接收完成后发送中断通知机制,Linux接收到接收完成命令后调用event_wakeup唤醒发送线程。

 

 

 

参考资料:

[1] https://github.com/OpenAMP/open-amp

[2] https://github.com/nxp-mcuxpresso/rpmsg-lite

 

 

标签:RPMsg,间通信,处理器,Linux,组件,OpenAMP
From: https://www.cnblogs.com/mic-chen/p/18217210

相关文章

  • Activity与Fragment之间通信(二)——接口回调
    一。引言上篇文章讲述了Activity和Fragment怎么样通过Bundle传递消息,这篇介绍如何通过接口回调实现通信。首先,Bundle并不适用于任何通信情况,我们来看看Bundle通信的缺点:(1)数据类型的限制:Bundle只能传递一些基本数据类型,如int,String等,无法直接传递自定义对象。(2)繁琐的代码:在......
  • Vue3实战笔记(47)— 一探emit奥秘——组件间通信的艺术与实践
    文章目录前言一、Vue2中的emti二、Vue3的emit总结前言Vue封装了自定义组件之后,如果子组件想要向父组件传递数据该怎么办?Vue.js中的emit方法就是主要用于组件间的通信,特别是父组件与子组件之间的通信机制。它是Vue组件内部触发自定义事件并向父级组件传递数......
  • 【Linux学习】进程间通信 (2) —— 信号
    下面是有关进程通信中信号的相关介绍,希望对你有所帮助!小海编程心语录-CSDN博客目录1.信号 1.1概念 1.2信号的产生 1.3信号的处理方式 2.函数 2.1kill()函数 2.2 signal()函数 2.3 sigaction()函数 2.4 sigprocmask()函数 2.5sigqueue()函数......
  • 进程间通信(管道)、多线程理论、开设多线程的两种方式、threading介绍、线程之间共享数
    【一】进程间通信(管道)借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出。这种通信方式是非阻塞的,即发送进程不需要等待接收进程的响应即可继续执行。multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的进程间通信(IPC)有两种方式:队列......
  • 互斥锁、进程间通信(IPC)、队列(queue)模块、队列实现进程间通信、生产者和消费者模型
    【一】互斥锁【1】什么是进程同步(互斥锁)互斥锁(Mutex)是一种用于多线程编程中控制对共享资源访问的机制。其作用是保证在同一时刻只有一个线程在访问共享资源,从而避免多个线程同时读写数据造成的问题。互斥锁的基本原理是在对共享资源进行访问前加锁,使得其他线程无法访问该......
  • Linux实验五:进程间通信(一)
    目录一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1.编辑源代码test5.c步骤2.编译源代码test5.c步骤3.运行可执行程序test5步骤4.进一步调试源代码test5.c六、实验结果七、实验总结一、实验目的1、理解Linux进程通信的基本原理和方法;2......
  • 【Linux学习】进程间通信 (1) —— 管道
    下面是有关进程通信中管道的相关介绍,希望对你有所帮助!小海编程心语录-CSDN博客1.进程通信的基本概念1.1概念进程间通信简称IPC ,指两个进程之间的通信。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和......
  • 进程间通信(管道),多线程
    Ⅰ进程间通信(管道)【一】引入借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出。这种通信方式是非阻塞的,即发送进程不需要等待接收进程的响应即可继续执行。multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的进程间通信(IPC)方式二......
  • linux实现namespace间通信
    一目的linux实现两个namespace间通信 二操作1.逻辑①创建两个namespace②创建一对网络接口③给每个namespace分配网络接口④每个namespace设置ip,激活网卡⑤测试两个namespace能否通信  三资料Networknamespace是linux内核提供的用于实现网络虚拟化的重要......
  • mit6.828笔记 - lab4 Part C:抢占式多任务和进程间通信(IPC)
    PartC:抢占式多任务和进程间通信(IPClab4到目前为止,我们能够启动多个CPU,让多个CPU同时处理多个进程。实现了中断处理,并且实现了用户级页面故障机制以及写时复制fork。但是,我们的进程调度不是抢占式的,现在每个进程只有在发生中断的时候,才会被调度(调用shed_yeild),这样就有可能会有......