0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析核间通讯的设计与实现—以NXP IPCF为例

jf_C6sANWk1 来源:汽车电子与软件 2023-09-27 09:18 次阅读

01

前言

随着汽车电子的高速发展,电控单元的复杂性越来越高,对芯片的算力要求也迅速提高,于是,例如ARM架构这样的异构处理器的应用也更为普遍。对于多核异构处理器而言,核间通讯是一项至关重要的特性。核间通讯的性能往往能对整个处理器的性能释放起到决定性的作用。

本文将以NXP的IPCF为例,并简单对比一些其他方案,浅析核间通讯的设计与实现。

02

软件架构

2e39f0d8-5cd2-11ee-939d-92fbcf53809c.png

IPCF架构框图

根据IPCF架构框图,它基于硬件(NXP硬件平台),服务于应用(客户应用程序),由硬件驱动(ipc-hw)、操作系统接口(ipc-os)与功能实现(ipc-shm)这三个子模块构成。通过这一设计,核间通讯方案可以将算法实现与下层的软、硬件系统解耦,实现高度的模块化和可移植性。

03

硬件驱动(ipc-hw)

硬件驱动是架构中的最底层。它与硬件直接相关,负责实现对硬件的操作,例如通知(中断)和数据(内存)的操作。

在IPCF的架构设计中,硬件驱动全权掌管对硬件的交互,向上则面向操作系统接口与功能实现这两个子模块。

代码实例

2e558776-5cd2-11ee-939d-92fbcf53809c.png

在NXP公开的源码中可以看到,对于不同的硬件平台,它分别提供了对应的C语言实现,而头文件保持一致,确保接口的一致性。

粗略阅读头文件可以看到,这一模块主要提供的是对芯片中断的支持,可以完成注册、启用、禁用和触发中断等一系列操作。

核间通讯中断的硬件设计也是一门学问。NXP的S32系列芯片设计了若干个专用的核间通讯中断(具体数量由芯片型号决定),每个中断都有自己的一组寄存器以实现导向触发(Steering),用户可以通过寄存器配置,灵活设置每一个中断的发送核与接收核。这样可以利用有限的资源,实现业务所需的具体核心之间的通讯需求。

04

操作系统接口(ipc-os)

操作系统接口是架构中的中间层,但从整个系统而言,它也可以说是软件方面的最底层。它负责与操作系统交互,例如掌控程序的执行流程(中断和任务的调用)。

在IPCF的架构设计中,操作系统接口向下依赖于硬件驱动,向上服务于功能实现。

代码实例

2e60b290-5cd2-11ee-939d-92fbcf53809c.png

在NXP公开的源码中可以看到,对于不同的操作系统,它也分别提供了对应的C语言实现。在A核侧可以看到有对uio的支持,而如果拿到M核侧的源码,则可以看到对AUTOSAR、FreeRTOS等多个操作系统的支持。

相比硬件驱动,操作系统的接口明显更多样(毕竟硬件都是NXP自家的),但无一例外地都应当实现软件模块的各种例程在操作系统中的适当调用。

虽然操作系统林林总总,但这一子模块需要解决的问题无非是各类例程的调用(初始化、周期任务、中断任务)和对软件底层资源的使用(文件读写)。

05

功能实现(ipc-shm)

功能实现是架构中的最上层,负责提供对应用程序的软件接口,并依赖于硬件驱动和操作系统接口来实现通讯的逻辑。相比起更为直白和稳定的软硬件基础件,功能实现的自由度更大,可供发挥的空间也更多。针对具体业务设计更高效的功能实现将起到事半功倍的效果。

代码实例

2e703788-5cd2-11ee-939d-92fbcf53809c.png    

在NXP公开的源码中,这一子模块以其传输介质的形式(shared memory)被命名为shm。它实现了几种通用的通讯算法,以共享内存与中断通知的组合,完成消息和数据的传递。

和几乎所有的消息系统一样,它将消息的访问方式分为回调与轮询两种,以满足不同时效性要求的场景。

而在数据算法方面,它又设计了两种形式,其中unmanaged类型是以一段连续的内存区域为消息的内容,发送方可以直接覆盖数据,因此在例如接收方处理速度较慢的情况下,可能出现丢失数据的结果,但其优点在于发送的消息不会被阻塞,保证信息的实时性。正如其官方建议的那样,此类数据处理形式适用于例如视频流传输等整块访问数据的、新数据优先的场景中。

而managed类型则是一种先入先出式的队列系统。首先它会将内存区域划分成固定大小的缓存块,并根据一张读写的索引表,按顺序将数据存入缓存块中,再按顺序取出使用。这一层可以当作对存储器的基本数据队列处理。为了更好地利用内存空间,它还设计了另一层消息队列,支持分布不同长度的缓存块,可以理解为将多个缓存队列并列起来,但其代价是为了保证所有队列中消息的有序性,需要另建一张总的索引表来记录所有消息的读写索引。这种方式能够严格保证消息的有序和有效,但可能出现阻塞。

当然,这些现成的通讯算法并不一定能完全满足业务的需求,也存在许多明显的局限性,例如自身没有数据完整性校验、轮询方式不支持单条消息的读取等等,这些都是笔者在实际应用中所发现的,旨在抛砖引玉。到了这些时候,就需要软件开发者各显神通,或是加以改进,或是另辟蹊径,只为不断提高核间通讯的可用性,以满足日益繁杂的业务需求。

06

其它方案

Linux RPMsg framework for STM32MP15x

Rpmsg是Linux内核提供的一种通用的通讯方案,在当前的汽车电子领域有相当广泛的应用。下面是STM32MP15x系列芯片的RPMsg方案的概览:

2e775810-5cd2-11ee-939d-92fbcf53809c.png

从中可以看到,作为一种示范性的通用方案,它与NXP的IPCF也有许多异曲同工之妙。

我们自下而上来看,首先是SoC的硬件层。IPCC是inter-processor communication controller的缩写,负责的是核间通讯的通知(中断)收发,向上的mailbox和remote proc则相当于对硬件中断封装的驱动,这与NXP IPCF中的ipc-hw是大致对应的。MCUSRAM负责存储器的管理,其中的收发Vring及对应的缓存实现了消息队列,向上则联通Linux内核中的Virtio虚拟输入输出总线,最后是rpmsg模块,这样的结构也大致与ipc-os和ipc-shm对应。

TI Jacinto的IPC

2e7ecd7a-5cd2-11ee-939d-92fbcf53809c.png

在TI的Jacinto上也有类似的基于rpmsg的核间通讯方案IPC。从设计上与上述方案都大同小异:Mailbox管理中断,VRing管理数据,向上通过rpmsg模块实现消息的收发接口。

07

结语

本文通过实例分析和对比,介绍了核间通讯的总体软件架构设计与各个子模块的实现。作为影响多核系统性能的重要一环,核间通讯在如今的汽车电子模块中对实时性和吞吐量都提出了越来越高的要求,在一些具体业务中,还会对安全性等方面提出额外的需求。这一切也给核间通讯开辟了更多的发展空间,同时为广大汽车人提供了更广阔的舞台。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NXP
    NXP
    +关注

    关注

    60

    文章

    1214

    浏览量

    177275
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117746
  • AUTOSAR
    +关注

    关注

    9

    文章

    330

    浏览量

    21138
  • 多核处理器
    +关注

    关注

    0

    文章

    108

    浏览量

    19743
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61351
  • 触发中断
    +关注

    关注

    0

    文章

    11

    浏览量

    6533

原文标题:浅析核间通讯 —— 以NXP IPCF为例

文章出处:【微信号:阿宝1990,微信公众号:阿宝1990】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NXP LPC54110试用体验】+双通讯

    资料。实现通讯,就要了解双的开发、启动、通讯和互斥等方方面面。首先到NXP官网下载SDK包
    发表于 08-10 08:35

    非对称双MCU基础知识及通信

    来源 网络本文从对比两颗分立MCU与单芯片双MCU开始(LPC4350),展开介绍了非对称双MCU的基础知识与重要特点。接下来,重
    发表于 05-15 14:26

    使用qmss和pktdma进行通讯的疑问

    各位技术人员好:   我最近在使用多核导航器进行通讯功能开发,使用论坛里下载的keystone_navigator修改而来。   设计程序功能如下:   tx queue 800   tx
    发表于 06-21 06:57

    关于C6678IPC通信的问题

    测试C6678的通信,使用的IPC中断的方式。中间看到在文档中关于每个IPC生成寄存器中包含了28个源ID,源ID的作用取决于软件的定义,是不是可以理解我如果写其中的源SRCS27,则我在中断
    发表于 08-03 07:15

    计数器IP了解IP使用流程

    IP应用之计数器实验目的:了解FPGA的IP相关知识并以计数器IP学会基本IP使用的流程实验平台:无实验原理: IP
    发表于 03-04 06:35

    redhat的github使用

    github上有许多开源的项目,你可以把代码下下来学习研究。或者你也可以自己创建个项目,用github来做版本管理,比svn用起来方便多了啊。下面redhat说下怎么使用github。
    发表于 07-16 06:07

    MIPI项目讲解Diamond FIFO生成和化全过程

    在MIPI多路摄像头拼接项目中,需要使用到FIFO的IP来进行数据的缓存与时钟域的交互,下面我来介绍一下Diamond FIFO IP生成与化的步骤。首先,找到生成IP的窗口,
    发表于 12-12 15:54

    通信(IPC)解决方案

    框模块所示,每个上都运行了IPC软件模块,从而实现了TDA4VM上不同之间的通信。本文的后续部分将以TDA4VM
    发表于 11-03 07:26

    A+M通信过程解析

    /G2L系列以及TI的AM62x系列等等。虽然这些处理器的品牌及性能有所不同,但多核通信原理基本一致,都是基于寄存器和中断传递消息,基于共享内存传输数据。配电终端产品,A负责
    发表于 11-23 15:09

    在S32g274板上测试IPCF的问题求解

    大家好, 我有一个关于在 S32g274 板上测试 IPCF 的问题。测试模型是 Linux 用户空间的图 4 IPCF。分支:release/bsp32.0打印失败:当测试运行
    发表于 03-15 06:59

    S32G2 IPCF调试错误是怎么回事?

    IPCF初始化正常,但是一开始会报错,可以正常接收数据。信息如下: 接收了一段时间,核心A没有日志输出,也没有接收到数据。M会报IPC_SHM_ACQUIRE_BUF失败。信息如下
    发表于 03-23 06:47

    i.MX8MPMSPI通讯如何实现

    小编手上的OKMX8MP-C开发板基于NXP i.MX8M Plus多核异构处理器设计,它的M有1路SPI,因而为实现SPI的相互通讯,我们就需要两块OKMX8MP-C开发板的SPI
    发表于 04-11 13:35

    SW32K3_IPCF_3.4.0_D2112_ReleaseNotes.pdf文件打不开的原因?

    第一步:下载NXP_Multi_Installer_17.05.23.095453_setup.exe安装完成。 第 2 步
    发表于 05-18 07:47

    S32DSV3.5能否从IPCF V3.7.0导入适用于S32K324的IPCF例程?

    S32DSV3.5能否从IPCF V3.7.0导入适用于S32K324的IPCF例程?
    发表于 05-19 07:07

    IPCF demo with FreeRTOS on CM7无法通过中断完全通信怎么解决?

    我在CM1和CM2上创建并修改了IPCF_Example_multi_instance_S32G274_M7的demo ,通过中断实现了内核通信,无需OS。 但是当我添加 FreeRTOS
    发表于 06-01 06:07