hi3559v100 sdk中雙系統AMP架構的初步了解


hi3559v100是海思推出的camera soc處理器。采用的是雙核處理器。一個是a7,運行的linux3.18內核。一個是a17使用的是huaweiliteos操作系統,Hi3559V100 系統中 Huawei LiteOS 負責系統媒體編解碼相關業務。兩個操作系統實現amp的構建形式。

首先了解一下sdk中的內容。

分別解壓兩個sdk包目錄如下:

image

作為嵌入式軟件開發來說,重點關注以下兩個目錄:

  1. hardware

主要是一些datasheet,demo板的原理圖。

  1. sofaware

板端,pc端,手機端所使用到的開發調試 維護的軟件包,工具包和文檔

1. sdk的軟件架構:

image

  1. OSDRV 層主要提供底層系統支持包,如 Bootloader、OS、Rootfs 模板,關鍵driver 及交叉編譯工具鏈,雙核通信驅動等。
  2. MPP 層和原有監控領域 SDK 保持一致,包含主要的媒體模塊驅動相關庫,如VI、VPSS、VENC、VO 等,對外提供 MPI 接口。
  3. Hisyslink 為雙核雙系統通信組件,用於雙系統間的消息通信,數據傳遞。為了簡化降低客戶在雙系統方面的開發難度,SDK 包提供了 NDK 媒體適配參考代碼,供客戶參考,客戶在實際產品開發過程中,也可以在 MPI 接口上,根據目標市場產品形態,對基礎音視頻業務功能和數據流進行重新封裝。
  4. Middleware 層主要提供了典型的業務組件,如錄像、拍照、文件管理、回放、GUI 及網傳等。

2. sdk中的雙核業務部署:

image

  1. NDK媒體業務在雙系統部署。

NDK 即媒體相關的功能模塊基本都在 Huawei LiteOS 上具體實現(即 MAPI Local模式),並通過在 linux 側提供 MAPI client 接口,對外提供媒體服務。MAPI local和 MAPI client 之間通過雙核通信組件 Hisyslink 實現通信。

  1. Middleware 和 References 在 Linux 側部署,便於用戶擴展。

  2. 硬件資源在雙系統部署。

媒體相關硬件部署在 Huawei LiteOS 側;但外設控制器及其相關中斷,內存等硬件資源應該根據產品需要,進行雙系統部署。

3. IPCM

在soc上部署的amp構架,一個linux,一個是huawei liteos。兩個系統間的通信機制:ICMP

Linux+Huawei LiteOS 雙系統業務部署中,媒體業務的硬件資源及功能實現都部署在Huawei LiteOS 端,並通過核間通信,把媒體服務延伸到 Linux 端,Linux 提供和Huawei LiteOS 端相同的接口定義。這就需要 Linux 和 Huawei LiteOS 提供核間通信機制,為媒體業務提供消息通信和大塊數據通信機制。核間通信組件IPCM 就是專門為Linux+Huawei LiteOS 雙系統核間通信設計的底層組件。

IPCM 的底層通信機制基於共享內存+中斷方式實現。

IPCM 是基於共享內存區域實現多核通信的,每個核(OS)擁有一塊自己的內存區域(基址+長度),同時知道其它每個核(OS)擁有的內存區域(基址+長度)。

發送消息(帶消息頭)時,需指定目標核 ID(target)和端口(port),將消息填充到目標的內存區域。

接收消息時,從自己的內存區域讀取數據,根據消息頭讀取一個消息。

雙核之間通過 GIC 中斷通知對方有消息准備好,需要對方讀取。

Hi3559V100 在 IPCM 基礎上再封裝實現 HisysLink 子系統,一般情況下不直接訪問IPCM 接口進行雙核通信。這里只介紹 IPCM 模塊的初始化動作。

  • Linux 端

掛載 hi_ipcm.ko

  • Huawei LiteOS 端

調用_ipcm_vdd_init();初始化 IPCM 模塊。

由於 IPCM 使用一片內存區域供 Linux 與 Huawei LiteOS 共同訪問實現消息通信。當執行 rmmod hi_ipcm 卸載完 Linux 的 IPCM 模塊后,也需要在 Huawei LiteOS 調用_ipcm_vdd_cleanup 去初始化 IPCM。如果 Linux 與 Huawei LiteOS 兩端初始化與去初始化 IPCM 不一致(比如一端去初始化並再次初始化 IPCM,另一端不執行相應操作),將會導致內部共享內存區域未同步,造成訪問異常地址而出現系統掛死。

4. 共享文件系統sharefs:

Huawei LiteOS 上運行的某些應用需要進行一些配置文件的讀寫和臨時中間文件的產生和刪除。但 Hi3559V100 的 flash、sd、usb 均部署在 Linux 端,導致 Huawei LiteOS 無法使用 yaffs、FAT 之類文件系統進行文件的訪問。因此開發 Sharefs 文件系統,在Huawei LiteOS 端虛擬一個文件系統,利用 IPCM 通信和共享內存,實現其讀寫 Linux上指定目錄下的內容。Sharefs 可以幫助 Huawei LiteOS 從 Linux 端讀寫文件,類似於NFS。Sharefs 指定訪問 Linux 的目錄可作為 flash,sd,usb,nfs 等的掛載點。這樣,可實現 Huawei LiteOS 通過 Sharefs 訪問 yaffs、FAT、NFS 等文件系統。將 Huawei LiteOS 需要訪問的文件放在 Linux 端 Sharefs 指定目錄,Huawei LiteOS 即可訪問其需要的文件。假如共享的目錄是liteos這個目錄,Huawei LiteOS 端訪問/liteos 目錄,即為 Linux 端實際目錄/liteos。在 Huawei LiteOS 端可使用 open/read/write/lseek/close 等系統調用,也可使用 fopen/fread/fwrite/fclose 等標准 I/O 庫訪問/liteos 目錄。具體的使用如下:

4.1 sharefs的使用:

將 Huawei LiteOS 需要訪問的文件放在 Linux 端 Sharefs 指定目錄,Huawei LiteOS 即可訪問其需要的文件。Sharefs 使用步驟如下:

步驟1. Sharefs 在目錄 osdrv/ components/sharefs/sharefs 下,在其目錄執行./build.sh 編譯出Linux 端使用的庫(sharefs/out/linux/ liblinux_sharefs.a)和 APP(sharefs/out/linux/sharefs),Huawei LiteOS 端使用的庫(sharefs/out/liteos/ libsharefs.a)。(此步驟已通過頂層 SDK 編譯執行完成,可不做)

步驟2. Huawei LiteOS/Linux 使用方法

Huawei LiteOS 端使用方法:sharefs/include/sharefs_client.h 為其使用 Sharefs 用到的頭文件。首先執行 IPCM 初始化,調用 _ipcm_vdd_init();再調用HI_ShareFs_Client_Init("/liteos");

完成初始化,其傳參"/liteos"為 Sharefs 指定訪問的文件目錄,在 Linux 端需要有一個與其同名的目錄。用戶可自行指定 Sharefs 訪問目錄。可使用 HI_ShareFs_Client_Check()接口查看 Sharefs 是否建立連接。返回 true 表示建立連接。方可執行文件訪問。可使用 HI_ShareFs_Client_Get_Path()接口獲得 Sharefs 指定訪問的目錄。此目錄實際存在於 Linux 端文件系統中。

Linux 端使用方法:首先加載 IPCM 模塊,在單板根文件系統下執行/komod/ipcm 或insmod /komod/hi_ipcm.ko;如果采用 APP 執行:sharefs &,如果采用庫,則在用戶APP 中調用 HI_ShareFs_Server_Init()。

Sharefs 在 Linux 端使用的是用戶態程序,其會與其它用戶態程序一起競爭 CPU 資源。當 Linux 端 CPU 使用率太高(大80%)時,Sharefs 的 APP 執行效率會受到一定影響,會引起 Huawei LiteOS 端通過 Sharefs 訪問 Linux 端文件效率下降,訪問時長增加。此時需要提高 Sharefs 進程的優先級優先搶占 CPU 資源,命令:nice --19 sharefs&。采用 Sharefs 庫時,需要提高使用其庫的 APP 優先級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM