硬核科普 | 詳解全志 V853 上的 ARM A7 和 RISC-V E907 之間的通訊方式

語言: CN / TW / HK

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

微信圖片_20220523110309.png

  • 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 系統。啟動的兩個系統是獨立執行的。

boot.png

異構系統的通訊

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 中斷來傳遞訊息。記憶體的管理由主核負責。

image-20220704155816774.png

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

image-20220704160952936.png

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

  • 主核先從USED中取得一塊記憶體(Allocate)
  • 將訊息按照訊息協議填充
  • 將該記憶體連結到 AVAIL 緩衝區中(Send)
  • 觸發中斷,通知輔助核有訊息處理

2958689-e0da20bb240ff26d.png

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

  • 主核先從AVAIL中取得一塊記憶體(Allocate)
  • 將訊息按照訊息協議填充
  • 將該記憶體連結到 USED 緩衝區中(Send)
  • 觸發中斷,通知主核有訊息處理。

2958689-9430112ac1bc82dd.png

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

image-20220704161948895.png

其中 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;

異構系統的控制

在異構系統中,不止需要訊息的傳輸,還需要相關控制。例如主核對輔助核心的開啟,載入韌體,關閉等等。這就需要用到 remoteproc 框架。

remoteproc 框架支援對不同平臺,不同架構的處理器進行控制,可以監控輔助核心的執行情況。

對於 V853 來說,remoteproc 用於對 E907 進行生命週期管理,一般來說包含有載入韌體、 檢測遠端處理器是否崩潰等功能。它在載入遠端處理器的韌體時,會根據韌體中定義的 resource table 來申請資源,並建立 VirtIO 裝置。

本文分享自微信公眾號 - 全志在線

本文為全志在線開發者社群整理的 詳解全志V853上的ARM A7和RISC-V E907之間的通訊方式