老實說,好久之前就知道cortex-A 和cortex-M 構成的異構處理器芯片是個好東西。好比NXP ,TI早就有這樣的SOC出現了,可是老是怕怕的,以爲它們開發起來好麻煩。網絡上的介紹也說得稀裏糊塗。直到最近使用STM32MP157C 才發現,至少STM32MP157 用起來沒有想象的難。在作了一些基礎的實驗以後,我還本身設計了一個應用層協議IO-RPC (IO 遠程過程調用)。爲設計Linux 的嵌入設備作準備。這將加快咱們向基於Linux 的應用轉移的步伐。相關內容和想法目前並不成熟,分享給你們探討。編程
remoteprc,rpmsgAPI和open AMP
STM32MP157C 是異構多處理器結構,它有兩個cortex-A7 核和一個cortex-M4 核構成。這是一種非對稱處理機架構(AMP Asymmetric Multi-processing)。爲了實現RTOS或者裸機程序可以與Linux 上的程序相互通訊。須要一個標準化的多核架構。。在Linux的內和中,包含了remoteproc和rpmsgAPI 組件。這個基礎架構最先是由Texas Instrument 開發的。在此基礎上mentor 公司 開發了OpenAMP框架。在這個框架下,主Linux 內核經過remoteproc API 來控制和管理remote 內核的生命週期(能夠啓動,中止 其它內核運行),爲remote processor 分配系統資源和建立虛擬IO virIO設備。而遠程內核中的程序經過openAMP 庫來註冊virIO 並經過virIO 與主Linux 上的應用程序通訊。網絡
簡單的虛擬IO就是串口(UART),下圖中,就是在主Linux和遠程處理器之間註冊了兩個虛擬UART。將複雜的多處理器通訊轉化爲兩個UART。是否是好神奇?固然,這樣的UART 的傳輸速度應該是遠遠高於物理的UART。由於他們是經過共享內存的方式實現的。在具體實現中,咱們將虛擬virUART0做爲IO-RPC 的通訊通道,而將virUART1做爲調試串口來使用。架構
IO-RPC 協議
STM32MP157C的異構處理器架構中cortex-A7 與cortex-M 之間採用上述方式實現相互通訊的,它提供了虛擬串口透明地傳輸數據。這仍是不夠的,咱們在此基礎上設計了IO-RPC 協議。使Linux 應用程序更加便捷地訪問cortex-M4 的IO資源和程序。框架
。一般由cortex-A 完成網絡和數據處理事務(基於Linux OS),cortex-M 完成實時IO 接口控制(基於RTOS),因而,須要數據設計·一種相對通用的雙機通訊協議來實現數據處理程序和IO控制程序之間的數據交換,有利於規範程序設計,提高程序的靈活性,可擴展性。編碼
IO-RPC 使用了遠程過程調用的機制,經過調用M4 上的過程實現對cortex-M 上接口資源和程序的訪問和控制。爲了提升效率,IO-RPC二進制編碼RPC形式。spa
圖-1 異構處理器之間的RPC 協議設計
與傳統RPC不一樣之處是,當硬件接口的信號或者狀態是隨機發生時,須要有一種相似中斷的通知機制。在協議中設置了通知(notification)幀,通知硬件發生的事件。調試
IO-RPC 的細節
對象程序設計的理念對象
IO-RPC 協議中引入了面向對象程序設計的理念,將各類IO 外設類型定義爲對象,具體的IO 外設視做爲對象的實體。blog
幀結構
RPC 調用(A7 –>M4)
對象類型,對象實體,方法,參數長度,參數
RPC 結果(M4 ->A7)
對象類型,對象實體, 結果 ,參數長度,參數
通知M4 ->A7)
對象類型,對象實體,通知,參數長度,參數
- 對象類型(Object Type ,1個字節)
- 對象實體(object instance ,1個字節)
- 方法,結果,通知(1 個字節)
- 參數長度(2個字節)
- 參數(n個字節)
對象類型
理論上對象能夠是任何類型的,在這裏咱們僅限於一臺基於STM32MP157C 的可編程控制器PAC爲例。
PAC控制器提供了下列對象類型
- 數字輸入(8 路數字輸入)
- 數字輸出(8 路數字輸出)
- 模擬輸入(兩路模擬輸入)
- 模擬輸出(兩路模擬輸出)
- RS485(兩路UART)
- FD-CAN(一路FD CAN)
對象實體
對象的實體使用二進制編碼。
- 數字輸入 (0~7)
- 數字輸出 (0~7)
- 模擬輸入 (0~1)
- 模擬輸出(0~1)
方法
每一種接口對象中包含了若干方法。它們採用二進制順序編碼做爲一個ID。好比:
- Read
- Write
- PWMOut
實現(略)
之後放出來。