hi3559v100是海思推出的camera soc處理器。採用的是雙核處理器。一個是a7,運行的linux3.18內核。一個是a17使用的是huaweiliteos操做系統,Hi3559V100 系統中 Huawei LiteOS 負責系統媒體編解碼相關業務。兩個操做系統實現amp的構建形式。linux
首先了解一下sdk中的內容。架構
分別解壓兩個sdk包目錄以下:工具
做爲嵌入式軟件開發來講,重點關注如下兩個目錄:ui
主要是一些datasheet,demo板的原理圖。操作系統
板端,pc端,手機端所使用到的開發調試 維護的軟件包,工具包和文檔設計
NDK 即媒體相關的功能模塊基本都在 Huawei LiteOS 上具體實現(即 MAPI Local模式),並經過在 linux 側提供 MAPI client 接口,對外提供媒體服務。MAPI local和 MAPI client 之間經過雙核通訊組件 Hisyslink 實現通訊。調試
Middleware 和 References 在 Linux 側部署,便於用戶擴展。component
硬件資源在雙系統部署。視頻
媒體相關硬件部署在 Huawei LiteOS 側;但外設控制器及其相關中斷,內存等硬件資源應該根據產品須要,進行雙系統部署。blog
在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 模塊的初始化動做。
掛載 hi_ipcm.ko
調用_ipcm_vdd_init();初始化 IPCM 模塊。
因爲 IPCM 使用一片內存區域供 Linux 與 Huawei LiteOS 共同訪問實現消息通訊。當執行 rmmod hi_ipcm 卸載完 Linux 的 IPCM 模塊後,也須要在 Huawei LiteOS 調用_ipcm_vdd_cleanup 去初始化 IPCM。若是 Linux 與 Huawei LiteOS 兩端初始化與去初始化 IPCM 不一致(好比一端去初始化並再次初始化 IPCM,另外一端不執行相應操做),將會致使內部共享內存區域未同步,形成訪問異常地址而出現系統掛死。
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 目錄。具體的使用以下:
將 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 優先級。