TI 8127 Appro 框架簡析
這也許是我接觸的最後一個嵌入式專案了
開發環境Ti8127開發板
Appro框架跨度很廣,除了最底層使用的是帶有 ti_ 字首的底層函式外(包括共享記憶體分配,m3驅動等不開源的程式碼庫),其餘的幾乎都是Appro框架中完成,並做了對應的再封裝,程式碼量巨大。
我所讀過的程式碼,估計只佔1/3,主要是應用層(ipnc_app)和MCFW(Multi-channel framework,ipnc_mcfw),而在ti_tools的程式碼,幾乎未染指,只在必要的地方,做了一些大膽但適用的修改。
Appro框架的核心在於它四個晶片(core)間共享記憶體的管理,所有訊息與資料在core之間的交換都是通過共享記憶體,而這一段程式碼是不開源的,只能通過更改巨集設定,來決定每一個共享區域(segment)的大小。其次,每一個模組(一個core可以有多個模組)由一個執行緒負責(引入link的概念),而每個link都由一個SystemServer執行緒管理(此SystemServer非ipnc_app中的system_server),而這僅是ti_tools的設計,在ipnc_mcfw中,再次以這種設計封裝,並應用這一設計(demo/usecase);而在ipnc_app中,又使用了同樣的設計(此時已沒有使用link的概念,但是執行緒+server使用訊息佇列的模式還是同樣的),來封裝(管理)web,rtsp等上層應用。
在mcfw中,用usecase來體現底層links的設計,將各links(cameraLink,EncLink,DecLink,DisplayLink等)串聯起來,就可以實現一個完整的採集,編碼,解碼,顯示的流程,當然,其中還有很多降噪和演算法的link。這是一種很有趣的模式,模組間完全沒有耦合,但是又因為SystemServer的存在,又高度的聚合,使用者只需要關心單個link的輸入是否符合該link的要求,輸出是否符合下一個link的輸入的要求。這種模式也有侷限性,即使其資料流是線性且單一的,輸入只能有一個,輸出可以多路或者單路或者不輸出(有一個特殊的MergeLink,用於同步多通道資料,允許N路輸入,N路輸出,但是向上追溯的話,還是隻有一個數據源),類似流水線的操作,我想這種模式應該可以在很多情況下借鑑使用。