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