天天看點

詳解全志V853上的ARM A7和RISC-V E907之間的通信方式

V853晶片包含兩個CPU。一個是主核心Arm A7 CPU,運作Tina Linux(全志自研Linux)系統,為晶片主系統;一個是RISC-V E907輔助CPU,運作Melis(全志自研RTOS)系統,主要功能是提供通用算力補充、輔助 Linux 實作快起和低功耗管理等功能。

詳解全志V853上的ARM A7和RISC-V E907之間的通信方式
  • A7 - Linux系統

V853主核心 A7上運作的是Tina Linux系統。Tina Linux是全志針對AIoT類産品,基于Linux核心深度定制的嵌入式系統。

在 Tina Linux 中,提供 AMP 與 RPMsg 對接 E907

1.Linux remoteproc 管理控制 E907

2.RPMsg 與 E907 通訊

  • E907 - RTOS系統

V853 輔助核心 E907 上運作的是全志自研 RTOS 系統 Melis。其獨立于 A7 主核心中的 Linux 系統。可以獨立運作。

在 E907 Melis 中,提供 OpenAMP 軟體架構來與 A7 Linux 系統進行通信。

1.提供了處理器的生命周期管理(LCM,Life Cycle Management),與 Linux 的 remoteproc 相容

2.提供了處理器間的消息傳輸機制,與 Linux 的 RPMsg 相容

異構系統啟動流程

首先,由晶片内部的 BORM 尋找啟動媒體,在 V853 開發闆上便是 eMMC 儲存器。找到啟動媒體後會運作其中的 BOOT0 代碼。BOOT0 會在 A7 主核心中運作 Linux 系統,也會在 E907 核心中運作 RTOS 系統。啟動的兩個系統是獨立運作的。

詳解全志V853上的ARM A7和RISC-V E907之間的通信方式

異構系統的通信

V853 的異構系統通訊在硬體上使用的是 MSGBOX,在軟體層面上使用的是 AMP 與 RPMsg 通訊協定。其中 A7 上基于 Linux 标準的 RPMsg 驅動架構,E907基于 OpenAMP 異構通信架構。

V853 所帶有的 A7 主核心與 E907 輔助核心是完全不同的兩個核心,為了最大限度的發揮他們的性能,協同完成某一任務,是以在不同的核心上面運作的系統也各不相同。這些不同架構的核心以及他們上面所運作的軟體組合在一起,就成了 AMP 系統 (Asymmetric Multiprocessing System, 異構多處理系統)。

由于兩個核心存在的目的是協同處理,是以在異構多處理系統中往往會形成 Master - Remote 結構。主核心啟動後再啟動輔助核心。當兩個核心上的系統都啟動完成後,他們之間就通過 IPC(Inter Processor Communication)方式進行通信,而 RPMsg 就是 IPC 中的一種。

在AMP系統中,兩個核心通過共享記憶體的方式進行通信。兩個核心通過 AMP 中斷來傳遞訊息。記憶體的管理由主核負責。

詳解全志V853上的ARM A7和RISC-V E907之間的通信方式

AMP 系統在每個通信方向上都有兩個緩沖區,分别是 USED 和 AVAIL,這個緩沖區可以按照 RPMsg 中消息的格式分成一塊一塊連結形成一個環。

詳解全志V853上的ARM A7和RISC-V E907之間的通信方式

當主核需要和從核進行通信的時候可以分為四步:

  • 主核先從USED中取得一塊記憶體(Allocate)
  • 将消息按照消息協定填充
  • 将該記憶體連結到 AVAIL 緩沖區中(Send)
  • 觸發中斷,通知輔助核有消息處理
詳解全志V853上的ARM A7和RISC-V E907之間的通信方式

反之,從核需要和主核通信的時候也類似:

  • 主核先從AVAIL中取得一塊記憶體(Allocate)
  • 将消息按照消息協定填充
  • 将該記憶體連結到 USED 緩沖區中(Send)
  • 觸發中斷,通知主核有消息處理。
詳解全志V853上的ARM A7和RISC-V E907之間的通信方式

既然 RPMsg 是一種資訊交換的協定,與TCP/IP類似,RPMsg 協定也有分層,主要分為三層,分别是傳輸層、MAC層和實體層。

詳解全志V853上的ARM A7和RISC-V E907之間的通信方式

其中 MAC層 的 VirtIO 是一種I/O 半虛拟化解決方案,是一套通用 I/O 裝置虛拟化的程式,是對半虛拟化 Hypervisor 中的一組通用 I/O 裝置的抽象。提供了一套上層應用與各 Hypervisor 虛拟化裝置之間的通信架構和程式設計接口,減少跨平台所帶來的相容性問題,大大提高驅動程式開發效率。

RPMsg 總線上的消息都具有以下結構,包含消息頭和資料兩個固定的部分,該消息格式的定義位于drivers/rpmsg/virtio_rpmsg_bus.c中,具體定義如下:

struct rpmsg_hdr {
    u32 src;
    u32 dst;
    u32 reserved;
    u16 len;
    u16 flags;
    u8 data[];
} __packed;
           

異構系統的控制

繼續閱讀