創建在STM32MP157 openAMP 上的IO-RPC協議

老實說,好久之前就知道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

實現(略)

之後放出來。

相關文章
相關標籤/搜索