hi3559v100是海思推出的camera soc處理器。採用的是雙核處理器。一個是a7,運行的linux3.18內核。一個是a17使用的是huaweiliteos操作系統,Hi3559V100 系統中 Huawei LiteOS 負責系統媒體編解碼相關業務。兩個操作系統實現amp的構建形式。 首 ...
hi3559v100是海思推出的camera soc處理器。採用的是雙核處理器。一個是a7,運行的linux3.18內核。一個是a17使用的是huaweiliteos操作系統,Hi3559V100 系統中 Huawei LiteOS 負責系統媒體編解碼相關業務。兩個操作系統實現amp的構建形式。
首先瞭解一下sdk中的內容。
分別解壓兩個sdk包目錄如下:
作為嵌入式軟體開發來說,重點關註以下兩個目錄:
- hardware
主要是一些datasheet,demo板的原理圖。
- sofaware
板端,pc端,手機端所使用到的開發調試 維護的軟體包,工具包和文檔
1. sdk的軟體架構:
- OSDRV 層主要提供底層系統支持包,如 Bootloader、OS、Rootfs 模板,關鍵driver 及交叉編譯工具鏈,雙核通信驅動等。
- MPP 層和原有監控領域 SDK 保持一致,包含主要的媒體模塊驅動相關庫,如VI、VPSS、VENC、VO 等,對外提供 MPI 介面。
- Hisyslink 為雙核雙系統通信組件,用於雙系統間的消息通信,數據傳遞。為了簡化降低客戶在雙系統方面的開發難度,SDK 包提供了 NDK 媒體適配參考代碼,供客戶參考,客戶在實際產品開發過程中,也可以在 MPI 介面上,根據目標市場產品形態,對基礎音視頻業務功能和數據流進行重新封裝。
- Middleware 層主要提供了典型的業務組件,如錄像、拍照、文件管理、回放、GUI 及網傳等。
2. sdk中的雙核業務部署:
- NDK媒體業務在雙系統部署。
NDK 即媒體相關的功能模塊基本都在 Huawei LiteOS 上具體實現(即 MAPI Local模式),並通過在 linux 側提供 MAPI client 介面,對外提供媒體服務。MAPI local和 MAPI client 之間通過雙核通信組件 Hisyslink 實現通信。
Middleware 和 References 在 Linux 側部署,便於用戶擴展。
硬體資源在雙系統部署。
媒體相關硬體部署在 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 優先順序。