黃言磊,葉光明
(武漢郵電科學研究院,湖北 武漢 430074)
責任編輯:任健男
由于嵌入式操作系統(tǒng)具有低功耗、集成度高、可裁剪等優(yōu)點,現(xiàn)在嵌入式設(shè)備已經(jīng)越來越多地應用于各個領(lǐng)域。軟件架構(gòu)設(shè)計是嵌入式設(shè)備的軟件設(shè)計過程中一個很重要的環(huán)節(jié)。但不同嵌入式操作產(chǎn)品的軟件架構(gòu)在實現(xiàn)中存在內(nèi)存泄露、堆棧溢出、競爭條件、死鎖、時序問題、可重入條件等各種問題,造成了嵌入式軟件開發(fā)效率低、周期長,并且影響產(chǎn)品的性能和市場競爭力。
為了很好地解決上述問題,本文提出了一種面向嵌入式應用的新的軟件架構(gòu)解決方案——視頻監(jiān)控PU統(tǒng)一平臺總體架構(gòu)。其架構(gòu)如圖1所示,分為OS適配層、應用層、協(xié)議層、硬件適配層。其中OS適配層、協(xié)議層、應用層定義為平臺軟件,平臺軟件設(shè)計要求適應所有類型的前端設(shè)備,設(shè)備間的差別通過配置文件進行開支[1-3]。硬件適配層定義為產(chǎn)品支持庫,該層提供統(tǒng)一的接口與平臺軟件交互,對于不同的設(shè)備類型需開發(fā)相應的硬件適配層。
圖1 視頻監(jiān)控PU統(tǒng)一平臺總體架構(gòu)圖
OS適配層(Operation-System Adaptation Layer)定義系統(tǒng)公用的統(tǒng)一接口函數(shù),包括網(wǎng)絡通信接口(TCP/UDP)、系統(tǒng)服務接口(定時器、內(nèi)存管理、線程/進程管理、消息、信號量)、文件I/O接口(錄像文件、配置文件)、配置文件接口、系統(tǒng)日志、系統(tǒng)維護。
OS適配層的目的是當需要將代碼移植到其他操作系統(tǒng)時,只需要修改該層的內(nèi)容。
1)定時器
在進程執(zhí)行的期間需要對進程的執(zhí)行時間加以控制,從而控制進程的執(zhí)行過程,這需要使用定時器或信號。定時器就像鬧鐘,可以設(shè)置一個時間,進程運行到規(guī)定的時間,“鬧鐘”就會觸發(fā),而進程就可以被觸發(fā)去做一個特定的工作。
2)內(nèi)存管理
內(nèi)存池(Memory Pool)是一種內(nèi)存分配方式。使用new、malloc等API申請分配內(nèi)存會造成大量的內(nèi)存碎片并進而降低性能。內(nèi)存池則是在真正使用內(nèi)存之前,先申請分配一定數(shù)量的、大小相等的內(nèi)存塊留作備用。當有新的內(nèi)存需求時,就從內(nèi)存池中分出一部分內(nèi)存塊,若內(nèi)存塊不夠再繼續(xù)申請新的內(nèi)存。這樣可以避免內(nèi)存碎片,使得內(nèi)存分配效率得到提升。
3)線程/進程管理
Linux是用線程來實現(xiàn)多任務并發(fā)的系統(tǒng)。進程可以共享大多數(shù)系統(tǒng)資源,同時擁有足夠分享的上下文維護各自的控制線程。因此一個線程的數(shù)據(jù)可以直接為其他線程所用,線程間通信也方便快捷。線程/進程管理包括初始化線程、建一個線程、分離一個線程、終止線程、線程同步。本架構(gòu)中的所有任務進程都是基于實時傳輸控制協(xié)議(RSTP)通信機制與其他相關(guān)進程通信。
4)消息
消息隊列是Linux下進程間通信的一種方式,一般用于傳送少量數(shù)據(jù),如果大量數(shù)據(jù)需要在進程間共享,則可以用共享內(nèi)存。使用一般過程如下:(1)調(diào)用ftok接口產(chǎn)生一個key;(2)調(diào)用msgget(使用key作為參數(shù))產(chǎn)生一個隊列;(3)進程可以用msgsnd發(fā)送消息到這個隊列,相應的別的進程用msgrcv讀取;(4)刪除消息隊列。
5)信號量
信號量是提供任務間通信、同步和互斥的主要手段。適用于保護多份復制的資源。
錄像文件接口支持前端錄像、平臺錄像、錄像查詢、錄像回放、錄像下載[4]。
使用開源的SQLite數(shù)據(jù)實現(xiàn)錄像、圖片的信息的管理。SQLite數(shù)據(jù)庫是專門為嵌入式系統(tǒng)設(shè)計的,與MySQL數(shù)據(jù)庫相比,具有占用內(nèi)存小的優(yōu)點。
在多用戶、多任務環(huán)境中,配置文件控制用戶權(quán)限、系統(tǒng)應用程序、守護進程、服務和其他管理任務。這些任務包括管理用戶賬號、分配磁盤配額、管理電子郵件和新聞組,以及配置內(nèi)核參數(shù)。
在本系統(tǒng)中,所有的文件系統(tǒng)的變化、添加和改變都被記錄到“日志”中。每隔一定時間,文件系統(tǒng)會將更新后的文件及文件內(nèi)容寫入磁盤,之后刪除這部分日志。重新開始新日志記錄。日志文件系統(tǒng)能夠詳細記錄系統(tǒng)每天發(fā)生的各種各樣的事件,使數(shù)據(jù)、文件變得安全。
系統(tǒng)維護模塊實現(xiàn)對系統(tǒng)應用任務的活動狀態(tài)監(jiān)控,所有被監(jiān)控的任務通過定時發(fā)送活動消息到系統(tǒng)維護模塊以表示其活動狀態(tài),如果在設(shè)定的時間內(nèi)沒有收到應用任務的活動狀態(tài)將啟動維護方式,包括重新啟動系統(tǒng)。
應用層實現(xiàn)系統(tǒng)應用業(yè)務流程。包括業(yè)務應用(簡稱Cmd)、媒體傳輸(簡稱Media)、設(shè)備管理(簡稱Mg,實現(xiàn)告警輸入輸出相關(guān)功能)、存儲(簡稱Record)、User Interface模塊(簡稱Ui)、網(wǎng)管模塊(簡稱Nm)等模塊。應用層應達成如下目的:考慮不同的平臺接入需求,可方便擴展支持接入其他的平臺。
應用層功能軟件的運行由多個任務進程完成,由一個總的控制進程管理所有的進程,它負責監(jiān)控所有任務進程的狀態(tài),同時由于每個進程都具有初始態(tài)、掛起態(tài)、運行態(tài)和終止態(tài)等4種基本狀態(tài),總控制進程通過發(fā)送消息命令控制這4種狀態(tài)之間的切換。這種機制的優(yōu)點在于只要定義好任務接口,各個任務進程模塊就可以被當作獨立軟件模塊來操作實現(xiàn)。很明顯,嵌入式系統(tǒng)應用層這一級的開發(fā)提高了代碼的復用度。
應用層的業(yè)務交互如圖2所示。
視頻監(jiān)控平臺(包括其他廠家平臺)通過Cmd模塊實現(xiàn)信令交互。媒體處理信令通過調(diào)用Media模塊接口進行。存儲抓拍信令通過調(diào)用Record模塊接口進行。其他信令(包括參數(shù)配置等)直接調(diào)用Mg模塊接口。
Web客戶端通過Nm模塊實現(xiàn)對設(shè)備的訪問。Nm模塊中,對于設(shè)備的操作統(tǒng)一通過Mg模塊實現(xiàn)。對于媒體流,Nm模塊需要與Media的媒體控制子模塊進行交互。
對于車載、單兵等具有本地顯示的設(shè)備,通過Ui實現(xiàn)對設(shè)備的訪問。Ui模塊中,對于設(shè)備的操作統(tǒng)一通過Nm模塊實現(xiàn)。
圖2 應用層的業(yè)務交互示意圖
業(yè)務應用模塊實現(xiàn)與平臺之間的信令交互處理流程。實現(xiàn)要求如下:接收并處理來自平臺的SIP信令;媒體傳輸信令調(diào)用媒體傳輸模塊接口函數(shù);告警處理信令調(diào)用告警處理模塊接口函數(shù)。
業(yè)務交互模塊分為信令交互子模塊和信令處理子模塊。信令交互子模塊實現(xiàn)信令的接收、分發(fā)和發(fā)送等功能。信令處理子模塊實現(xiàn)對信令的處理流程。
媒體傳輸模塊實現(xiàn)設(shè)備與平臺之間的媒體傳輸,包括視頻傳輸、音頻傳輸,支持UDP傳輸和TCP傳輸。模塊分兩部分,一部分mediaControl用于媒體控制,主要是指對設(shè)備通道資源的控制,編碼器開啟關(guān)閉,通道占用與釋放的工作都在這個文件中進行處理;另一部分為mediaTrans,用于媒體傳輸部分,專門負責媒體數(shù)據(jù)的傳輸,現(xiàn)支持TCP與UDP傳輸。將媒體模塊分為兩部分的好處在于以后如果需要接入其他平臺,只需修改mediaTrans模塊的傳輸協(xié)議部分,mediaControl部分可以不用修改,直接調(diào)用。
存儲模塊分為錄像存儲子模塊、抓拍子模塊和錄像回放子模塊。
錄像存儲子模塊錄像文件的類型分為三種,即定時錄像、報警錄像和手動錄像。定時錄像又分為每天模式和每周模式,不管什么模式,每天最多有3個定時錄像的時間段,且每個錄像的時間段是不能重疊的,也不能跨天。報警錄像可能包括報警預錄和延遲錄像,其中報警預錄是可選的,且預錄的時間不超過30 s。
錄像模塊主要由以下子模塊組成:1)定時器。該定時器的定時精度為1 s,用于檢測周期錄像的開始和結(jié)束時間,同時維護錄像控制中的相對時間。2)錄像線程。從預錄隊列中取視頻數(shù)據(jù),然后保存到存儲設(shè)備。3)緩沖隊列。編碼庫出的視頻數(shù)據(jù),加上存儲幀頭以后,存于緩沖隊列中。為了避免出現(xiàn)內(nèi)存碎片,同時兼顧每個節(jié)點的訪問速率,緩沖隊列應采用大內(nèi)存管理機制。根據(jù)視頻的最大碼率及預錄的時間,一次性分配所有的內(nèi)存空間。緩沖隊列采用數(shù)組的形式,節(jié)點空間的分配和回收都由大內(nèi)存管理模塊進行。
錄像文件的命名規(guī)則為:PUID_通道號_錄像類型_錄像開始時間.后綴。錄像名共43 byte,每個域所占的字節(jié)數(shù)如表1所示,對應的格式如表2所示。例如:420000000267908936_01_01_20111105160000.264。
表1 錄像命名規(guī)則中每個域的詳細信息表
表2 錄像命名規(guī)則中每個域的格式表
抓拍子模塊的規(guī)則與錄像規(guī)則類似。
協(xié)議層實現(xiàn)與PU相關(guān)的網(wǎng)絡協(xié)議,包括SIP,RTP,RTCP,RTSP,SOAP,HTTP 等。
硬件適配層的目的是當系統(tǒng)需要支持不同的硬件方案時,只需要修改硬件適配層的內(nèi)容。該層包括看門狗、串口、CODEC、告警、設(shè)備配置、云臺控制等模塊。采用嵌入式DSP處理器用于計算離散時間信號,在圖像處理方面上有很高的編譯效率和執(zhí)行速度。該層位于架構(gòu)的最底層,它封裝了硬件的各種功能行為,包括硬件初始化、中斷的產(chǎn)生和處理、硬件看門狗啟動、硬件時鐘管理,提供了對各種開發(fā)板的硬件功能操作的統(tǒng)一軟件接口,這是保證操作系統(tǒng)可移植性的關(guān)鍵。
本文提出的這種新的軟件架構(gòu)方案,具有較好的容錯能力、可重用性、安全性、擴展性、可管理性。當某一層需要調(diào)整時,可以不對其他層面進行任何修改,從而降低了整個設(shè)計系統(tǒng)之間的依賴性。同時它能夠讓設(shè)計開發(fā)人員在編碼分工變得更加明確更加優(yōu)化,只要做好各個層次的接口定義即可,縮小了工作冗余量,提高了研發(fā)人員的效率。通過研究和項目實踐證實了這種方案可被很好地用于中興力維接入平臺。
[1]梅大成,楊大千,趙娜.基于Linux的嵌入式網(wǎng)絡攝像機設(shè)計[J].微計算機信息,2007(23):45-47.
[2]勁松.基于TMS320DM355的高清網(wǎng)絡攝像機的設(shè)計與實現(xiàn)[D].南京:南京郵電大學,2009.
[3]湯凱,劉峰.基于TMS320DM355的網(wǎng)絡高清視頻監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J].電視技術(shù),2009,33(12):98-101.
[4]吳海龍,孫運強.網(wǎng)絡攝像機監(jiān)控系統(tǒng)的應用研究[D].太原:中北大學,2010.