IPC通信
- IPC的基本概念
處理器間通信(IPC)提供了一個與處理器無關的API,可用于多處理器環境中處理器之間的通信(內核間)、與同一處理器上的其他執行緒的通信(行程間)和與外圍設備(設備間)的通信,API支持訊息傳遞、流和鏈接串列,IPC可用于與以下方面進行通信:
同一處理器上的其他執行緒
運行SYS/BIOS的其他處理器上的執行緒
運行HLOS的其他處理器上的執行緒(例如Linux、QNX、Android)

處理器間/處理器內部通信(IPC)是一種產品,用于在多處理器環境中實作處理器之間的通信,IPC的特點包括訊息傳遞、多處理器門、共享記憶體原語等.
IPC被設計用于與運行SYS/BIOS應用程式的處理器一起使用,這通常是ARM或DSP,IPC包括支持高級作業系統(HLOS),如Linux,以及SYS/BIOS RTOS,在HLOS環境中支持的IPC特征的寬度被減少,以便簡化產品,
IPC通常分布并安裝在更大的SDK中,在這些情況下,不需要安裝,
在SDK之外,IPC可以在這里下載,并作為zip檔案發布,要安裝,只需提取檔案即可…這將在目錄中提取IPC產品及其產品名稱和版本資訊(例如,c:/ti/ipc_),
IPC產品提供多個處理器之間的軟體連接,每個處理器可以運行HLOS(例如
Linux、QNX)或RTOS(例如,SYS/BIOS),IPC是一個開源的專案, 你可以在這里找到它http://git.ti.com/ipc/ipcdev.
處理器SDKInstaller(ti-processor-sdk-linux-[platformName]-evm-xx.xx-Linux-x86-Install.bin)將安裝必要的組件,以便在TI微處理器上啟動您的開發,SDK由MatrixAppLauncher起始點應用程式的源代碼、一個開發檔案系統、一個目標檔案系統、示例應用程式、工具鏈和板支持包、易用性腳本和檔案組成,處理器SDK現在包括ARM GCC工具鏈,處理器SDK是根據特定的Linux發行版名稱和版本Ubuntu16.04和18.04構建和測驗的,注意,這并不妨礙用戶在其他Linux發行版上安裝SDK,
最后一步是下載并安裝處理器-SDKRTOS,要獲取本軟體的最新版本,請參見設備的“軟體產品”頁,
示例的二進制影像位于主機和各個內核的相應目錄中,可以通過使用通過JTAG的CCS加載和運行二進制檔案來運行示例,
本文面向在Cortex A 15上運行Linux的AM57xx用戶,其目標是幫助用戶了解如何獲得AM57xx的DSP(C66x)和IPU (Cortex M4)子系統的權限,
AM572x設備有兩個IPU (IPUSS),每個子系統有兩個核心,IPU 2被用作多媒體應用程式中的控制器,所以如果您在運行處理器SDK Linux,那么IPU 2很可能已經加載了韌體,但是,IPU 1是開放的,用于通用編程來卸載ARM任務,
這個任務有很多方面:構建、加載、除錯、MMU、記憶體共享等等,本文打算采取漸進的步驟來理解所有這些部分,
- IPC for AM57xx
AM57xxSOC“S”有多個處理器內核-CortexA15、C66xDSP和ARMM4內核,A15通常運行諸如Linux/QNX/Android之類的HLOS,而RemoteCore(DSP)S和M4)運行RTOS,在正常操作中,引導加載器(U-boot/SPL)引導并加載帶有HLOS的A15,A15啟動DSP和M4內核,

在這個序列中,電源復位與遠程設備(即DSP和M4)之間的間隔取決于HLOS初始化時間,
下圖說明ARMLinux內核的遠程proc/rpMsg驅動程式如何與運行RTOS的從處理器(如DSP、IPU等)上的IPC驅動程式通信,

為了在從內核上設定IPC,我們在IPC包中提供了一些可從ARMLinux運行的預先構建的示例,接下來的章節描述了如何構建和運行此示例,并將其用作此作業的起點,
CMEM
To view the allocation at run-time:
root@am57xx-evm:~# cat /proc/cmem
這表明我們在0xA0000000的物理基地址上定義了一個CMEM塊,其總大小為0xc 000000(192 MB),此塊包含由1個緩沖區組成的緩沖池,池中的每個緩沖區(本例中只有一個)被定義為大小為0xc000000(192 MB),
更改DSP記憶體映射
首先,重要的是要理解,存在一對位于DSP子系統和L3互連之間的存盤器管理單元(MMUS),其中一個MMUUS用于DSP核心,另一個是針對其本地EDMA,它們都用于將虛擬地址(即,由DSP子系統觀看的地址)轉換為物理地址(即,從L3互連觀看的地址)的相同目的,
DSP物理地址DSP代碼/資料實際駐留的物理位置由CMA carveouts進行定義,要更改此位置,您必須更改香芹的定義,在LinuxDTS檔案中定義了DSP carveouts,例如對于AM57xxEVM:
您可以同時更改大小和位置,小心不要重疊任何其他carveouts!
此外,當您更改分出位置時,必須對資源表進行相應的更改,首先,如果您正在進行記憶體更改,則需要一個自定義資源表,資源表是一個大型結構,是物理記憶體和虛擬記憶體之間的“橋梁”,此結構用于配置位于DSP子系統前面的MMU,IPCResourceCustomTable一文中提供了詳細的資訊,
創建自定義資源表后,必須將phys_mem_IPC_VRING的地址更新為與相應的CMA相同的基址,
DSP虛擬地址
這些地址是DSP子系統看到的地址,也就是聯結器命令檔案中的地址,等等,您必須確保節的大小與資源表中的相應定義一致,您應該創建自己的資源表,以修改記憶體映射,這是在頁IPC資源自定義表中描述的,您可以查看IPC中的現有資源表:
換句話說,由于我們使用了身份映射,所以可以在它們的物理地址處訪問外圍設備,
運行時檢查DSPIOMMU頁面表
可以使用以下命令轉儲DSPIOMMU頁表:
一般來說,MMU 0和MMU 1的編程方式是相同的,所以您只需要查看其中一個或另一個就可以理解給定DSP的映射,
“da”(“設備地址”)列反映虛擬地址,它是從索引中派生的,即在頁表中不存在“da”暫存器或欄位,地址空間中的每個MB映射到表中的條目,顯示“da”,使其易于找到感興趣的虛擬地址,
“pte”(“頁表項”)列可以根據上述表20-4進行解碼,例如:
1: 0x4a000000 0x4a040002
0x4a040002向我們表明,它是一個基地址0x4A000000的超值,這給了我們一個16 MB的記憶體頁面,注意后面重復的條目,這是MMU的要求,
為了充分理解CortexM4IPU子系統的記憶體映射,認識到存在兩種不同/獨立的記憶體轉換級別很有幫助,以下是TRM中的片段以說明:
CortexM4 IPU物理地址
M4代碼/資料實際所在的物理位置由CMA carveout進行定義,要更改此位置,您必須更改香芹的定義,M4 carveout在LinuxDTS檔案中定義,例如對于AM57xxEVM:
此外,當您更改 carveout的位置時,必須對資源表進行相應的更改,首先,如果您正在進行記憶體更改,您需要自定義資源表,資源表是一個大型結構,是物理記憶體和虛擬記憶體之間的“橋”,此結構用于配置IPUxMMU(不是UniCacheMMU),在文章IPC資源定制表中提供了詳細資訊,創建自定義資源表時,必須將physmemIPCvring的地址更新為與相應CMA相同的基地址,
CortexM4IPU虛擬地址
UniCacheMMU,
UniCacheMMU最接近CortexM4,它提供了一級地址翻譯,UniCacheMMU實際上是由CortexM4“自行編程”的,UniCacheMMU也被稱為屬性MMU(AMMU),有固定數量的小、中和大頁面,以下是顯示一些關鍵映射的片段:
這3頁是“身份”映射,對關聯的地址范圍執行請求通過,這些中間地址在下一級翻譯(IOMMU)中被映射到它們的物理地址,用于代碼和資料的AMMU范圍需要是標識映射,因為否則RemoteProc加載器將無法與相關聯的IOMMU映射從ELF檔案中匹配這些部分,這些映射應足以滿足任何應用,即無需調整這些映射,修改的更可能區域是下一節中的資源表,AMMU映射主要用于理解關于CortexM4存盤器映射的完整影像,
IOMMU
IOMMU位于離L3互連最近的地方,它獲取來自AmMu的中間地址輸出,并將其轉換為L3互連所使用的物理地址,IOMMU是由ARM基于相關資源表撰寫的,如果您正在計劃任何記憶體更改,那么您將需要創建一個自定義資源表,如頁面IPC資源自定義表中所描述的那樣,
來自資源表的3個條目都來自相關聯的IPUCMA池(即,如由型別_CARSOUT所指示的),第二引數表示虛擬地址(即對IOMMU的輸入地址),這些地址必須與AMMU映射以及聯結器命令檔案一致,來自IPC的EX02_MessageQ示例在檔案示例/Dra7xx_Linux_ELF/EX02_MessageQ/共享/config.bld.中定義了這些記憶體部分您可以使用以下命令卸載IPUIOMMU頁面表:
示例:從IPU訪問UART5在本例中,假定引導加載程式中已經設定了PIN-MUXED,如果不是這樣,你就得在這做,UART5模塊需要通過CM_L4PER_UART5_CLKCTRL暫存器使能,這位于物理地址0x4A009870,因此,從M4,我們將在虛擬地址0x6A009870上對該暫存器進行編程,將值2寫入此暫存器將啟用外圍設備,在完成上一個步驟后,UART5暫存器將變為可訪問的,通常UART5可在物理基礎地址0x48066000處訪問,這將相應地從IPU在0x68066000處訪問,
默認情況下,IPU和DSP自動空閑,這可以防止您能夠使用JTAG連接到設備,也無法通過devme 2訪問本地記憶體,在sysfs中有一些選項是必要的,以強制這些子系統運行,有時這是開發和除錯目的所需要的,這些操作需要一些源自設備樹(dra7.dtsi)的硬編碼設備名稱:

要將這些系統FS名稱映射到關聯的RemoteProc條目,您可以運行以下命令:
root@am57xx-evm:~# ls -l /sys/kernel/debug/remoteproc/
root@am57xx-evm:~# cat /sys/kernel/debug/remoteproc/remoteproc*/name
命令的結果將是一對一的映射,例如,58820000.ipu對應于remoteproc0,
類似地,要查看每個核心的電源狀態:
root@am57xx-evm:~# cat /sys/class/remoteproc/remoteproc*/state
狀態可以掛起、運行、脫機等,只有當狀態“運行”時,才能附加JTAG,如果它顯示為“暫停”,則必須強制它運行,例如,假設DSP 0被“掛起”,可以運行以下命令強制執行:
root@am57xx-evm:~# echo on > /sys/bus/platform/devices/40800000.dsp/power/control
任何核心都是如此,但是用上面圖表中關聯的系統FS名稱替換40800000.dsp,
- 將IPC添加到從內核上的現有TI-RTOS
應用程式將IPC添加到DSP上現有的TIRTOS應用程式上
人們想要做的一個常見的事情是采用現有的DSP應用程式,并將IPC添加到它,當從DSP遷移到帶有ARM+DSP的異構SoC時,這很常見,這是本部分的重點,為了描述這個程序,我們需要一個示例測驗用例來處理,為此,我們將使用GPIO_LEDBLINK_EVMAM572X_C66XExample專案示例,該示例是PDK的一部分(作為處理器SDKRTOS的一部分安裝),您可以在C:TiPDK_AM57xx_1_0_4PackageMyExample_GPIO_LEDBLINK_EVMAM572X_C66XExample專案中找到它,此示例使用SYS/BIOS并將用戶0閃爍在AM572XGPEVM上,它在EVM絲印螢屏上標記為D4,恰好位于藍色重置按鈕的右側,
有幾個步驟進行整個程序作業,每個步驟將在下面的章節中進行描述,并使用代碼撰寫器Studio(CCS)在EVM上運行“開箱即用”LED閃爍示例,從IPC軟體包獲取EX02_訊息示例,并將其轉換為CCS專案,建立它并修改Linux啟動代碼以使用此新映像,這只是一個明智的檢查步驟,以確保我們可以在CCS中構建IPC示例,并讓它們在EVM啟動時運行,在CCS中,進行開箱即用的LED示例的克隆,并將其重命名為“S”示例的IPC版本,然后,使用EX02_MessageQ示例作為參考,在IPC塊中添加到LED示例,從CCS構建然后將其添加到Linux韌體檔案夾中,
將IPC添加到LED閃爍示例第一步是克隆出開箱即用的LED閃爍CCS專案,并將其重命名為使用IPC表示它,執行此操作的最簡單方法是使用CCS,下面是步驟……在“編輯”(Edit)透視圖中,進入“專案瀏覽器”(ProjectExplorer)視窗,右鍵單擊GPIO_LEDBLINK_EVMAN572XC66XExampleProject專案,然后從彈出式選單中選擇“復制”(Copy),Maske確定專案不是關閉狀態,Rick單擊專案瀏覽器視窗的“In”和“空”區域,然后選擇“過去”,彈出對話框,修改名稱以表示它使用IPC,一個好的名稱是GPIO_LEDBLINK_EVMAM572XC66XExamplejec_with_IPC,
右鍵單擊GPIO_LedBlink_evmAM572x c66xExampleProjec_With_IPC專案并在左側窗格中選擇Properties,單擊CCS General,在右側,單擊RTSC選項卡上的XDCtools版本:在產品和存盤庫串列中選擇3.32.0.06_core,檢查以下.IPC 3.43.2.04 SYS/BIOS 6.45.1.29 am57xx PDK 1.0.4 for Target,選擇ti.Target ts.elf.C66作為平臺,選擇ti.platforms.evmDRA7XX,在平臺被選中后,編輯其名稱BueHand并追加:dsp 1到末尾,在此之后,應該是ti.platforms.evmDRA7XX:dsp 1,然后將構建組態檔設定為DEBUG,按下OK按鈕,現在,我們希望將EX02_MessageQIPC示例的配置和源檔案復制到我們的專案中,IPC示例位于C:TiIPC_3_43_02_04ExampleDra7xx_Linux_ELFEX02_MessageQ,要將檔案復制到CCS專案中,您可以簡單地選擇Windows資源管理器中所需的檔案,然后將它們拖放到CCS中的專案中,將這些檔案復制到CCS專案中……
人們想要做的一件常見的事情就是使用一個現有的IPU應用程式,它可以控制串行或控制介面,并將IPC添加到其中,這樣韌體就可以從ARM加載,當從唯一的IPU解決方案遷移到具有MPUSS(ARM)和IPUSS的異構SoC時,這種情況很常見,這是本節的重點,為了描述這個程序,我們需要一個TI RTOS測驗用例來處理,為此,我們將使用屬于PDK(安裝為處理器SDKRTOS的一部分)的UART_BasicExgrom_evmAM572x_m4ExampleProject示例,此示例使用TI RTOS并在AM572xGP EVM上使用UART 3埠執行串行IO操作,它在EVM螢屏上被標記為SerialDebug,
為使整個程序作業采取了若干步驟,每個步驟將在下面的章節中進行描述使用代碼ComposerStudio(CCS)構建并運行EVM上的開箱即用UARTM4示例從IPC軟體包構建并運行EX02_MessageQ示例,并將其轉換為CCS專案,建立它并修改Linux啟動代碼以使用此新映像,這只是一個明智的檢查步驟,以確保我們可以在CCS中構建IPC示例,并讓它們在EVM啟動時運行,在CCS中,進行開箱即用UARTM4示例的克隆,并將其重命名為該示例的IPC版本,然后使用EX02_MessageQ示例作為參考,在IPC塊中添加到UART示例代碼,從CCS構建然后將其添加到Linux韌體檔案夾中,
Linux內核啟用所有配置所需的SOCHW模塊,適當的驅動程式配置所需的時鐘并初始化HW暫存器,對于所有未使用的IP,沒有配置時鐘, 使用設備樹在內核中禁用uart3節點,此外,這限制了內核將這些IP放到睡眠模式,
在每個IPU 1和IPU 2子系統中都有兩個MMU,L1 MMU稱為IPU_UNICACHE_MMU或AmMu和L2 MMU,關于如何在IPC-Remoteproc中配置這一點的說明已在Changing_Cortex_M4_ IPU _Memory_Map一節中進行了描述,IPC處理L1和L2 MMU不同于PDK驅動程式示例如何使用這些MMU設定記憶體訪問,用戶在集成組件時需要管理這些MMU,這種差異突出如下:
PDK示例將地址(0x4X000000)用于外圍暫存器,并使用以下MMU設定L2 MMU使用默認1:1映射Ammu Configuration將物理0x4X000000訪問轉換為邏輯0x4X000000
IPC遠程proc ARM M4要求IPU使用邏輯地址(0x6X000000),并使用以下MMU設定L2 MMU,使MMU將0x6X000000訪問地址轉換為地址0x4X000000(配置為1:1映射和0x6X000000)
因此,在將IPC與PDK驅動程式集成之后,建議使用別名地址來訪問外圍設備和PRCM暫存器,這需要更改PDK驅動程式和應用程式代碼中使用的地址,然后對IPU應用程式源代碼進行以下更改:
將UART_SOC.C檔案添加到專案中,并修改UART_HATTRS中所有IPUUART暫存器實體的基本地址,以使用別名地址:
添加自定義SOC配置還意味著您應該使用通用的UART驅動程式,而不是內置在SOC設定中的驅動程式,要執行此注釋,請在.cfg中使用以下行:
在應用代碼中也有一個實體,在該實體中,我們將指標添加到需要改變如下的PRCM暫存器,現在,您已經準備好構建韌體,構建.out之后,將擴展名更改為.xem 4,并將其復制到用于加載M4韌體的檔案系統中的位置,
- IPC模塊的子系統
IPC模塊初始化IPC的各個子系統,并同步多個處理器,
MessageQ模塊支持可變長度訊息的結構化發送和接收,
ListMP模塊是一個基于鏈表的模塊,旨在提供不同處理器之間的通信方式,它使用共享記憶體為多個處理器提供共享、傳遞或存盤資料緩沖區、訊息或狀態資訊的方法,
HeapMP模塊提供3種型別的記憶體管理、固定大小的緩沖區、多個不同的固定大小緩沖區和可變大小的緩沖區.
GateMP模塊通過其實體執行本地和遠程背景關系保護,通知模塊通過硬體中斷管理軟體中斷的復用/解復用,
SharedRegion模塊設計用于多處理器環境中,其中存在跨不同處理器共享和訪問的記憶體區域,串列模塊支持創建雙鏈接的物件串列,MultiProc模塊在多處理器環境中將處理器ID管理集中到一個模塊中,
NameServerModule管理本地名稱/值對,這使得應用程式和其他模塊能夠基于名稱來調整和檢索值,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/190225.html
標籤:其他
