正文
目前很多芯片都會有幾個core核,有的是Cortex M0+、M4、M7、A53、A73等等,有的有著2核、3核、4核甚至6核8核,不同的核的主頻支持度不一樣,適用的具體應用場景也不同,因此需要IPC(Inter-processor communication)來核間通信,進行數據的交互。
核間通信(IPC)的主要目標是:充分利用硬件提供的機制,實現高效的CORE間通信;給需要CORE間通信的應用程序提供簡潔高效的編程接口。
根據所使用的硬件特性,核間通信的實現機制有:
? ·Mailbox中斷
? ·基于共享內存的消息隊列
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
封裝-VRING-解析的過程:
1、應用程序向給定目的地(CPU、端點)發送消息
2、消息首先從應用程序復制到兩個CPU之間使用的VRING。此后,IPC 驅動程序在硬件郵箱中發布 VRING ID。
3、這會觸發目標 CPU 上的中斷。在目標 CPU 的 ISR 中,它提取 VRING ID,然后根據 VRING ID 檢查該 VRING 中的所有消息。
4、如果收到消息,它從VRING中提取消息并將其放入目標RPMSG端點隊列中。然后觸發在此 RPMSG 端點上阻止的應用程序。
5、應用程序處理接收到的消息,并使用相同的RPMSG 和VRING 機制在相反方向回復發送方CPU。
Hardware Mailbox
硬件郵箱主要用于提供具有小的 32 位有效負載的中斷事件通知。
VRING 使用硬件郵箱在目標 CPU 上觸發中斷。每個郵箱包含 16 個單向 HW 隊列,最多可連接 4 個通信用戶或 CPU。
J721E SoC 有 12 個硬件郵箱實例。即 12x 16 個硬件郵箱隊列。
(硬件郵箱的邏輯框圖)
Mailbox and VRING
郵箱本質上充當一個非常小的硬件隊列,其中包含 VRING ID。
VRING 是共享內存中的 SW 隊列,保存兩個 CPU 之間傳遞的實際消息。當收到中斷時,郵箱消息會告知從哪個 VRING 出列消息。
VRING ID=0 tells to look at the VRING from sender to receiver
VRING ID=1 tells to look at the VRING from receiver to sender
在這里插入圖片描述
散文
mailbox其實是多核處理器soc上,核與核之間互相發中斷的機制,由于核與核之間可能存在不同的業務,故硬件上設計分配一兩個中斷已經無法滿足業務的需求,軟件拓展起來很困難,所以mailbox可以理解為軟件可自由定義的中斷模塊。
用于在片上處理器之間通信的一種mailbox隊列中斷機制,mailbox隊列中斷機制允許軟件通過一組寄存器和關聯的中斷設置和得到信息在二個處理之間建立通信渠道。
核間通信的主要目標是:充分利用硬件提供的機制,實現高效的CORE間通信;給需要CORE間通信的應用程序提供簡潔高效的編程接口。
根據所使用的硬件特性,核間通信可能的實現機制有:
1. Mailbox中斷;
2. 基于共享內存的消息隊列;
3. POW + Group;
4. FAU;支持原子的讀,寫,fetch and add操作。
每個core有一個相應的32bit的mailbox寄存器,每一位可被單獨地設置或清零。這對于core間的中斷非常有用,任意core可直接通過其它core 的mailbox對其它core發出中斷。當mailbox被置位時,相應core的中斷寄存器也同時被置位,軟件可實現其中斷處理。
Bootloader支持Octeon_phy_mem_named_block_alloc( ),分配以名字命名的物理內存空間,不管是Service Executive應用程序還是linux kernel都可以通過Octeon_phy_mem_named_block_find( )找到這部分內存,實現core之間的共享數據。
Linux kernel也提供了共享內存的機制。主要有mmap(),系統V,Posix共享內存模型等。系統調用mmap()通過映射一個普通文件實現共享內存。普通文件被映射到進程地址空間后,進程可以向訪問普通內存一樣對文件進行訪問。系統V共享內存指的是把所有共享數據放在共享內存區域(IPC shared memory region),任何想要訪問該數據的進程都必須在本進程的地址空間新增一塊內存區域,用來映射存放共享數據的物理內存頁面。posix共享內存區首先指定一個名字參數調用shm_open,以創建一個新的共享內存區對象或打開一個以存在的共享內存區對象。然后調用mmap把這個共享內存區映射到調用進程的地址空間。傳遞給shm_open的名字參數隨后由希望共享該內存區的任何其他進程使用。
核間通信方案
如下圖所示ARM核和DSP核進行mailbox通信,ARM要發送數據給DSP:
? 1 ARM核先往某個指定的共享內存空間buffer寫入數據,然后MAILBOX觸發中斷和寫入關于共享內存空間的地址信息給DSP。
? 2 DSP通過得到mailbox中斷的信息讀取共享內存空間ARM核發送的buffer數據。
? 3 DSP核讀取完數據后將觸發mailbox中斷給ARM作為回應,告訴ARM核你發送的數據我已經接受完成了。a
在這里插入圖片描述
審核編輯:湯梓紅
-
芯片
+關注
關注
455文章
50851瀏覽量
423903 -
cpu
+關注
關注
68文章
10870瀏覽量
211874 -
中斷
+關注
關注
5文章
898瀏覽量
41514 -
Cortex
+關注
關注
2文章
202瀏覽量
46510 -
IPC
+關注
關注
3文章
347瀏覽量
51930
原文標題:參考資料:
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論