8. 多核系统

8.1. 参考资料

[1] https://elinux.org/images/3/3b/NOVAK_CERVENKA.pdf

[2] https://github.com/OpenAMP/open-amp/wiki/AMP-Intro

[3] https://github.com/NXPmicro/rpmsg-lite

[4] https://github.com/torvalds/linux/tree/master/drivers/rpmsg

[5] C:\Keil_v5\ARM\PACK\ARM\AMP\1.1.0

8.2. 多核处理器

从硬件架构区分

  • 同构多核:某一个芯片中的多个CPU的架构是相同的,比如都是CM3

  • 异构多核:某一个芯片中的多个CPU的架构是不同的,比如一个是CM3,一个是RISC-V

  • 异构多核处理器有:TI的达芬奇平台DM6000系列(ARM9+DSP)、Xilinx的Zynq7000系列(双核Cortex-A9+FPGA)

  • 同构多核处理器有:Exynos4412,freescale i.mx6 dual和quad系列、TI的OMAP4460等

从运行的软件模式区分

  • AMP(非对称多处理)

  • SMP(对称多处理)

8.3. AMP和SMP介绍

  • AMP全称asymmetric Muti-processing,翻译为不对称多核处理器(具体是指什么不对称呢?)

  • SMP全称symmetric Muti-processing,翻译为对称多核处理器(具体是指什么对称呢?)

  • 一个多核芯片,假设有A核和B核,如果A和B共享很多外设资源,包括内存资源,软件开发的模型,一般使用SMP,反之,如果A核和B核具有独立的外设和内存资源,一般使用AMP

  • AMP模式是指,在每个CPU核上单独运行程序,比如,A核上运行了一个UCOS操作系统,B核上运行了一个裸机程序

  • SMP模式是指,在所有CPU核中运行同一套软件,所有CPU的地位相同

  • AMP 虽然多个核心可以运行不同的系统,但是需要有一个主要的核心,需要使用该核心来控制整个系统以及其他的核心。例如:一个核心运行运行实时性较高的任务,另一个核心运行UI界面。

    image-20230125125525700

8.4. 开源AMP框架

8.5. OpenAMP介绍

OpenAMP解决了什么问题?

  • 在具有多个处理器的系统中,会面临一系列难题,比如

    • 内存怎么分配?

    • 系统资源怎么分配?

    • 处理器之间的数据怎么交换?

image-20230125165532097

image-20230126214146617

image-20230126214533428

8.6. OpenAMP组件

OpenAMP为AMP系统开发应用程序提供了三个重要组件: Virtio, RPMsgRemoteproc

虚拟化模块 Virtio

Virtio是一个管理共享内存的模块,Virtio中的vring是一个FIFO,FIFO中的每一个元素都是一个数据指针,有两个单向的vring,一个专门用于发送数据到远程处理器的消息;另一个vring用于保存从远程处理器接收到的消息,两个vring组成了一个环形

image-20230125162321570

远程处理器消息传递 RPMsg

image-20230125162359663

  • 位于Mailbox框架上层的是Remoteproc 远程处理框架

  • RPMsg框架基于Virtio的vrings,基于vrings发送和接受消息

  • RPMsg实际上是一种基于Virtio的消息总线,用于实现的是核间消息传递(传递核间数据),可以认为RPMsg是一个与远程处理器通信的通道,这个通道,我们也可以称它为RPMsg设备,每个通道都有一个本地源地址和远程处理器的目标地址,消息就可以在源地址和目标地址之间进行传输

  • image-20230125163225767

  • image-20230125163316431

远程处理 Remoteproc

对于非堆成多核处理器的SOC,不同的核心可能跑不通的操作系统,比如,STM32MP157的Cortex-A7运行linux操作系统,Cortex-M4运行RT-Thread或者裸机程序,为了使运行Linux的主处理器与协处理器之间能够轻松通信,在Linux3.4.x版本以后,引入了Remoteproc核间通信框架,该框架由TI公司开发,在此基础上,mentor graphics公司开发了一种软件框架OpenAMP, 在这个框架下,主处理器上的linux操作系统可以对远程处理器及其相关软件环境进行生命周期管理,即启动,或者关闭远程处理器

image-20230125163814969

image-20230125163858988

image-20230125164008631

image-20230125164234725

8.7. Linux驱动文件介绍

image-20230125164352349

image-20230125164822093

image-20230125164858870

image-20230125164905825

8.8. OpenAMP源码介绍

image-20230125165138610

image-20230125165441405

image-20230125165450353

8.9. 基于RPMsg实现异核通信

8.10. RPMsg

image-20230129164205848

image-20230126220659939

image-20230130135124554

  • 核A调用 rpmsg_lite_send接口,将A核应用数据拷贝到共享内存中,再IPI中断通知核B,核B接收它,将共享内存数据直接暴露给应用程序,应用程序负责调用rpmsg_queue_nocopy_free函数来释放接收到的数据。

RPMsg Channel

RPMsg组件中的每个远程核心都由RPMsg设备表示,该设备提供了主设备和远程设备之间的通信信道,因此RPMsg设备也被称为信道。RPMsg通道由通道名称和本地(源)和目标地址标识。RPMsg框架使用通道的名称来跟踪通道。

RPMsg Endpoints

RPMsg端点在RPMsg通道之上提供逻辑连接。它允许用户在同一通道上绑定多个rx回调。每个RPMsg端点都有一个唯一的src地址和关联的回调函数。当应用程序创建具有本地地址的端点时,所有目标地址等于端点的本地地址的进一步入站消息将被路由到该回调函数。每个通道都有一个默认端点,使应用程序能够在不创建新端点的情况下进行通信。

RPMsg Header

image-20230126221601510

image-20230126221546779

RPMsg Framework

image-20230126221847276

8.11. Linux RPMsg

image-20230128110329934

image-20230128110320375

image-20230128110307817

image-20230128110653148

image-20230128110739033

image-20230128110758787

image-20230128110928257

image-20230128111105579

8.12. RPMsg-Lite

image-20230128111218065

image-20230128111311040

8.13. RPMsg-Lite API

8.14. VIRTIO

Virtio:一个 I/O 虚拟化框架

image-20230129181848430

图形化解释

image-20230129182625454

参考文档

image-20230129184509139

image-20230129184537052

image-20230129184839862

image-20230129191712067

8.15. FreeRTOS AMP

freertos amp