趙興祥,趙 濤,唐 瑜,黃 華,彭 湖
(重慶金美通信有限責(zé)任公司,重慶400030)
嵌入式系統(tǒng)因其的裁剪性強(qiáng)、可靠性高、實(shí)時性好、能耗低等特性,被廣泛應(yīng)用在電子、通信、醫(yī)療等各行業(yè)中。隨著互聯(lián)網(wǎng)、5G、物聯(lián)網(wǎng)等技術(shù)的快速發(fā)展,嵌入式系統(tǒng)呈現(xiàn)出了系統(tǒng)化、生活化、網(wǎng)絡(luò)化、精簡化等發(fā)展趨勢[1]。在此背景下,穩(wěn)定、易擴(kuò)展、兼容性好的嵌入式軟件架構(gòu)是高水準(zhǔn)嵌入式軟件設(shè)計的可靠保障,也是嵌入式產(chǎn)品的性能及穩(wěn)定性的重要決定因素?,F(xiàn)有研究大多集中于此,但并不完善,例如:文獻(xiàn)[2]中提出的軟件架構(gòu),通過線程管理、備份硬件喚醒、通信協(xié)議設(shè)計等手段增強(qiáng)軟件的可靠性和穩(wěn)定性,但在移植性、擴(kuò)展性方面的設(shè)計還不充分;文獻(xiàn)[3]中通過擴(kuò)展Bios 設(shè)計提高嵌入式系統(tǒng)的可靠性,但沒有在擴(kuò)展性、兼容性方向做出設(shè)計;文獻(xiàn)[4]設(shè)計并實(shí)現(xiàn)了基于通信中間件的綜合化信號與信息處理機(jī)軟件架構(gòu)RCSSystem,采用直接數(shù)據(jù)包通信方式取代了CORBA 中間件的遠(yuǎn)程函數(shù)調(diào)用,通過總線互連,增強(qiáng)系統(tǒng)的穩(wěn)定性和可靠性,但架構(gòu)復(fù)雜,與硬件、驅(qū)動層耦合性大;文獻(xiàn)[5]中給出了基于多任務(wù)的實(shí)時處理架構(gòu)設(shè)計方法,但仍存在硬件耦合性大的問題。
針對嵌入式系統(tǒng)耦合高、擴(kuò)展性不足的現(xiàn)狀,在此設(shè)計一種低耦合、可移植、易擴(kuò)展、支持熱插拔的嵌入式設(shè)備主控軟件架構(gòu)。
結(jié)合 SOA(Service Oriented Architecture)思想及分層思想,將軟件定義為服務(wù),服務(wù)之間通過輕量化通信中間件進(jìn)行整合[6],各服務(wù)以插件的方式獨(dú)立運(yùn)行于系統(tǒng)中,可以根據(jù)需求動態(tài)加載或卸載各功能模塊,以滿足用戶業(yè)務(wù)、服務(wù)及性能的擴(kuò)展性要求。軟件總體結(jié)構(gòu)如圖1。
圖1 軟件總體架構(gòu)圖
結(jié)合嵌入式系統(tǒng)平臺,核心管理服務(wù)、通信中間件及硬件抽象層構(gòu)成了服務(wù)的基礎(chǔ),形成物理層、MAC 層、網(wǎng)絡(luò)層以及安全等多種類的標(biāo)準(zhǔn)接口服務(wù)組件,其詳細(xì)架構(gòu)如圖2 所示。
圖2 軟件架構(gòu)圖
核心管理服務(wù)是整個架構(gòu)的基礎(chǔ)服務(wù),作為獨(dú)立進(jìn)程,主要用來實(shí)現(xiàn)整個軟件框架的模塊(組件)管理和消息(類似參數(shù))管理。
2.2.1 模塊管理
模塊管理負(fù)責(zé)對各服務(wù)模塊的加載/卸載過程及服務(wù)組件狀態(tài)等進(jìn)行管理與監(jiān)控,對外提供模塊注冊注銷、模塊狀態(tài)查詢及狀態(tài)主動匯報等標(biāo)準(zhǔn)接口。模塊管理的運(yùn)作機(jī)制如圖3 所示。
圖3 模塊管理服務(wù)結(jié)構(gòu)圖
當(dāng)某個服務(wù)啟動時,先調(diào)用注冊接口向模塊管理注冊。模塊管理將該服務(wù)加入管理鏈表后,開始啟動監(jiān)控機(jī)制。監(jiān)控方式可以是由服務(wù)程序主動狀態(tài)匯報,也可以是模塊管理周期地查詢狀態(tài)。服務(wù)需要退出時,要先調(diào)用注銷接口脫離模塊管理。
2.2.2 消息管理
參數(shù)管理是參數(shù)(狀態(tài)及配置參數(shù))的集合,包含參數(shù)的定義與操作。消息管理對消息的訂閱、發(fā)布、可靠性保證等進(jìn)行管控,與參數(shù)具體含義無關(guān)。參數(shù)管理配合消息管理,實(shí)現(xiàn)配置消息的檢查、存儲與初始化。
服務(wù)完成注冊后,向消息管理模塊訂閱該服務(wù)啟動及運(yùn)行過程中所需的全部參數(shù)。消息管理將該服務(wù)所訂閱的參數(shù)記錄到參數(shù)訂閱列表,并通過參數(shù)管理模塊獲取參數(shù)值后,發(fā)給消費(fèi)者服務(wù)程序。如果某個參數(shù)值被修改,參數(shù)管理依據(jù)參數(shù)訂閱列表分發(fā)給各服務(wù)模塊。消息管理的體制如圖4。
圖4 消息管理服務(wù)結(jié)構(gòu)圖
路由拓?fù)?、信道質(zhì)量等實(shí)時且不需要保存的信息,由提供者主動發(fā)布,消息管理按需分發(fā)給服務(wù)消費(fèi)者。
這一設(shè)計的思想是:參數(shù)管理只需關(guān)注初始化配置參數(shù),設(shè)備狀態(tài)信息無需初始化,由供方服務(wù)主動發(fā)布;設(shè)備新增的參數(shù),只需信息提供方、需求方自行訂閱分發(fā)即可,核心管理模塊無需做任何更改。
本架構(gòu)中,服務(wù)間通信均通過通信中間件來實(shí)現(xiàn)。借鑒SCA 思想,通信中間件類似CORBA(Common Object Request Broker Architecture)的對象請求代理ORB。中間件以庫文件的形式集成到服務(wù)軟件中,通過宏定義選擇編譯,可廣泛移植于不同操作系統(tǒng)平臺。一般情況下,作為獨(dú)立的線程運(yùn)行在各個調(diào)用服務(wù)中,在沒有操作系統(tǒng)的CPU 上,中間件可以是一個接口封裝。
通信中間件的功能包括:
1)自動完成通信目標(biāo)的查詢及信息可靠傳輸;
2)為宿主程序提供同步、異步消息傳輸保障;
3)記錄各個模塊的通訊地址而無需每次發(fā)送消息重復(fù)查詢服務(wù)。
通信中間件的工作流程如圖5。
圖5 通信中間件工作流程圖
假設(shè)有服務(wù)A、B,在相互不知道對方是否存在的情況下,服務(wù)A 需要向服務(wù)B 發(fā)送業(yè)務(wù)時,服務(wù)A 向通信中間件發(fā)起試探,并從中間件獲得服務(wù)B的通信接口信息,隨后,即可向服務(wù)B 發(fā)起業(yè)務(wù)。通信的可靠性由通信中間件來保障。服務(wù)B 向服務(wù)A發(fā)起業(yè)務(wù)時,也是相同的操作。
通信中間件對外提供的接口如圖6 所示。
圖6 通信中間件結(jié)構(gòu)圖
消息中間件的創(chuàng)建由服務(wù)調(diào)用發(fā)起,服務(wù)需為通信中間件提供接收消息的回調(diào)函數(shù)。消息中間件的同步發(fā)送接口會阻塞服務(wù)進(jìn)程,異步發(fā)送接口要求服務(wù)提供回調(diào)函數(shù)。
平臺基礎(chǔ)服務(wù)包括日志服務(wù)及調(diào)試打印服務(wù)兩個基本服務(wù)和系統(tǒng)資源抽象服務(wù)。
(1) 日志服務(wù)
日志記錄了包括各服務(wù)啟動、異?,F(xiàn)場、系統(tǒng)資源使用情況等重要信息[7]。日志服務(wù)的數(shù)據(jù)在內(nèi)存中匯聚,周期性更新并保存到flash 上。
日志服務(wù)對外提供日志輸入與日志顯示兩種標(biāo)準(zhǔn)接口。外部程序按照接口要求調(diào)用獲得日志服務(wù)。日志服務(wù)的構(gòu)建如圖7 所示。
圖7 日志服務(wù)結(jié)構(gòu)圖
(2) 網(wǎng)絡(luò)調(diào)試打印服務(wù)
網(wǎng)絡(luò)調(diào)試服務(wù)提供基于優(yōu)先級的、支持本地/遠(yuǎn)端信息輸出的服務(wù)[8],結(jié)構(gòu)如圖8 所示。
圖8 網(wǎng)絡(luò)調(diào)試打印服務(wù)結(jié)構(gòu)圖
調(diào)用print_config 標(biāo)準(zhǔn)接口啟動調(diào)試打印服務(wù),并配置優(yōu)先級、輸出目標(biāo)IP 等參數(shù)。通過xPrint 接口打印自定義的輸出格式數(shù)據(jù)。
(3) 系統(tǒng)資源抽象服務(wù)
服務(wù)對平臺IPC(Inter-Process Communication)、信號、串口等系統(tǒng)資源進(jìn)行抽象化,將其封裝成標(biāo)準(zhǔn)的服務(wù)接口,無差別地為其他服務(wù)(包括通信中間件)提供支持。
公共應(yīng)用服務(wù)是指一般嵌入式通信設(shè)備均需要的一般服務(wù),如人機(jī)交互服務(wù)、網(wǎng)絡(luò)管理服務(wù)、軟件維護(hù)服務(wù)、測試支撐服務(wù)等。
架構(gòu)支持 LED 顯示屏、WEB、控制臺命令(Shell)等多手段的人機(jī)交互方式,形成標(biāo)準(zhǔn)的接口對外提供調(diào)用服務(wù)。類似于以操作為對象,對外提供不同的網(wǎng)絡(luò)管理服務(wù)接口,為上層應(yīng)用或服務(wù)提供網(wǎng)絡(luò)管控手段。
軟件維護(hù)服務(wù)主要是指軟件升級,涉及的場景共有三種,歸納于圖9 中。
圖9 軟件維護(hù)的三個場景
網(wǎng)絡(luò)中有服務(wù)器時,設(shè)備與服務(wù)器中的軟件進(jìn)行版本檢測對比,不是最新版本則從服務(wù)器下載最新的軟件進(jìn)行升級。沒有服務(wù)器時,設(shè)備之間自主進(jìn)行軟件版本匹配,如果設(shè)備之間軟件版本不一致則從最新版本設(shè)備中下載新程序進(jìn)行更新升級。
架構(gòu)中的測試支撐服務(wù)是一個集中處理可測試性的接入窗口服務(wù)。設(shè)備軟硬件可測試性主要由具體的硬件、軟件模塊提供支撐。
硬件可測試性支撐服務(wù)需要做到:提供各項(xiàng)硬件測試、檢測的執(zhí)行過程,并返回測試結(jié)果的自動測試功能;提供自動跳轉(zhuǎn)參數(shù)以滿足性能指標(biāo)的自動校準(zhǔn)功能。軟件可測試服務(wù),指的是提供各項(xiàng)測試的測試用例、測試指令輸入口及執(zhí)行測試用例功能。
測試支撐服務(wù)整體結(jié)構(gòu)如圖10 所示。其具備的功能包括:
①支持測試指令、校準(zhǔn)指令輸入;
②支持調(diào)試指令輸入;
③具備測試、校準(zhǔn)操作執(zhí)行過程集合。
該服務(wù)對外提供輸入接口,可按照既定輸入規(guī)范,對軟硬件模塊進(jìn)行狀態(tài)更改、控制及故障定位等進(jìn)行測試與調(diào)試。
圖10 測試支撐服務(wù)結(jié)構(gòu)圖
本設(shè)計選用的軟件架構(gòu),適用于Linux 系統(tǒng)下ARM、PowerPC、X86 等平臺的嵌入式設(shè)備開發(fā)。核心管理服務(wù)在開發(fā)過程中,考慮程序移植性,支持多平臺的編碼設(shè)計,以宏定義的方式,針對不同的硬件平臺進(jìn)行編譯選擇。考慮Linux 的內(nèi)核態(tài)和用戶態(tài)特性,在內(nèi)核態(tài)中,通過自定義標(biāo)準(zhǔn)函數(shù)指針的形式,對外提供注冊注銷以及數(shù)據(jù)發(fā)送接口,其他軟件模塊動態(tài)注冊時提供其數(shù)據(jù)接收接口;應(yīng)用態(tài)模塊間通過套接字進(jìn)行模塊間的數(shù)據(jù)傳輸。
本架構(gòu)下的服務(wù),應(yīng)用態(tài)下以.so 文件存在,內(nèi)核態(tài)下以.ko 文件形式存在。核心管理程序根據(jù)用戶需求,動態(tài)調(diào)用、加載相應(yīng)服務(wù)程序;用戶結(jié)束服務(wù)后,殺死或卸載對應(yīng)的服務(wù),減輕CPU 的負(fù)載壓力。依據(jù)Linux 系統(tǒng)可剪裁的特性,可根據(jù)嵌入式設(shè)備不同的應(yīng)用需求,調(diào)整Linux 系統(tǒng)的實(shí)時性、搶占式參數(shù),對架構(gòu)中各模塊的優(yōu)先級進(jìn)行設(shè)置,提高架構(gòu)在各平臺下不同應(yīng)用場景的適配性。
結(jié)合嵌入式系統(tǒng)的應(yīng)用背景,針對嵌入式設(shè)備可熱插拔、按需擴(kuò)展、廣泛移植應(yīng)用的需求,設(shè)計了可通用的主控軟件架構(gòu)。該軟件架構(gòu)基于SOA 思想進(jìn)行設(shè)計,具有松耦合、易擴(kuò)展、可移植、平臺無關(guān)等多個特點(diǎn),已在多個項(xiàng)目和設(shè)備上實(shí)際應(yīng)用,軟件的耦合性、擴(kuò)展性、移植性均得到充分驗(yàn)證,也可較好地適用于SCA、SDN 等技術(shù)的應(yīng)用環(huán)境,具有良好的實(shí)用性和應(yīng)用前景。