摘要:本文在嵌入式軟件設(shè)計(jì)的基礎(chǔ)上,提出了一種松耦合設(shè)計(jì)的方法。通過嵌入式軟件系統(tǒng)地橫向松耦合,實(shí)現(xiàn)了嵌入式系統(tǒng)中各個(gè)子模塊可以單獨(dú)編譯,單獨(dú)運(yùn)行,模塊間故障隔離以及系統(tǒng)運(yùn)行時(shí)動態(tài)升級的目的;通過嵌入式軟件系統(tǒng)的縱向松耦合設(shè)計(jì),實(shí)現(xiàn)了嵌入式系統(tǒng)跨操作系統(tǒng),跨硬件平臺運(yùn)行的需求。通過實(shí)驗(yàn)結(jié)果以及在數(shù)據(jù)通信設(shè)備中的應(yīng)用表明,松耦合嵌入式系統(tǒng)設(shè)計(jì)具有良好的可擴(kuò)展性和可移植性,非常適合現(xiàn)代通信系統(tǒng)的要求。
關(guān)鍵詞:嵌入式系統(tǒng);松耦合設(shè)計(jì);可移植性
中圖分類號:TP315 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9599 (2012) 24-0168-02
1 引言
松耦合就是降低系統(tǒng)部件和部件之間的偶合性,也就是降低部件的依賴性,使得部件之間相對獨(dú)立,這樣對于日后系統(tǒng)的維護(hù)及擴(kuò)展都是很有好處的。在應(yīng)用軟件開發(fā)中,松耦合設(shè)計(jì)模塊得到了廣泛的應(yīng)用,并且取得了比較大的效果,而在嵌入式開發(fā)中,應(yīng)用卻比較少見。在一個(gè)嵌入式軟件系統(tǒng)中,由于模塊與模塊之間相互調(diào)用函數(shù),共享全局變量等,造成了模塊之間緊耦合的關(guān)系,一個(gè)模塊出現(xiàn)故障時(shí),會造成其他模塊甚至整個(gè)軟件系統(tǒng)的崩潰。如果各個(gè)模塊之間是松耦合的關(guān)系,相互隔離,能夠單獨(dú)進(jìn)行編譯,安裝,出現(xiàn)上述問題的可能性將會降低。更重要的是,在保持模塊間松耦合關(guān)系的基礎(chǔ)上,能夠?qū)崿F(xiàn)軟件運(yùn)行時(shí)對單個(gè)模塊的升級而不影響整個(gè)系統(tǒng)。
與此同時(shí),嵌入式軟件一般都與操作系統(tǒng)以及硬件平臺關(guān)系緊密,系統(tǒng)跨平臺移植一直是一項(xiàng)比較復(fù)雜的工作。特別在通信產(chǎn)品的嵌入式軟件開發(fā)中,對于一些公共的協(xié)議模塊,比如路由協(xié)議(OSPF,BGP),應(yīng)用協(xié)議(DHCP,F(xiàn)TP),這些在所有的產(chǎn)品中都是通用,而各個(gè)通信產(chǎn)品所用的硬件平臺和嵌入式操作系統(tǒng)是不一樣的,使這些模塊成為一個(gè)平臺,實(shí)現(xiàn)各個(gè)產(chǎn)品與平臺的無縫銜接,具有較高可移植性,是嵌入式軟件系統(tǒng)縱向松耦合設(shè)計(jì)的目標(biāo)。
2 松耦合設(shè)計(jì)的方法
圖1為整個(gè)系統(tǒng)的架構(gòu)思想,對于松耦合的主要設(shè)計(jì)思想為上下分離,左右分開。該系統(tǒng)總共分為三層。
層1:主要是各個(gè)業(yè)務(wù)模塊,每個(gè)業(yè)務(wù)模塊可以是一個(gè)功能模塊,也可以是一個(gè)獨(dú)立的協(xié)議模塊,這些模塊就像刀片服務(wù)器一樣,能實(shí)現(xiàn)即插即用,具有高可擴(kuò)展性。
層2:消息代理器層,這是整個(gè)系統(tǒng)的基礎(chǔ),也是本文的核心思想,從圖中可以看出,它是連接業(yè)務(wù)模塊之間,以及業(yè)務(wù)模塊與操作系統(tǒng)的樞紐。
層3:也是最底層,包括操作系統(tǒng)和硬件,本文設(shè)計(jì)的嵌入式系統(tǒng)不包括這層,對于不同的硬件架構(gòu)的產(chǎn)品,這一層是不一樣的。
消息代理模塊是本設(shè)計(jì)的核心部件,它是連接模塊間以及軟件與操作系統(tǒng)以及硬件之間的橋梁。橫向松耦合通過它實(shí)現(xiàn)了模塊間通信,是星型通信模型的中心節(jié)點(diǎn);縱向松耦合通過它實(shí)現(xiàn)了軟件與操作系統(tǒng)以及硬件的通信,實(shí)現(xiàn)了平臺無關(guān)性功能。
圖1 松耦合嵌入式軟件系統(tǒng)總體架構(gòu)
2.1 橫向松耦合設(shè)計(jì)
模塊和模塊之間相互隔離,每個(gè)模塊即一個(gè)任務(wù),有自己獨(dú)立的堆棧空間,它們之間不能相互調(diào)用函數(shù),也不能相互訪問其他任務(wù)的全局變量。模塊和模塊之間只能通過進(jìn)程間通信方式進(jìn)行通信。由于有很多個(gè)模塊同時(shí)存在,一般情況下,各個(gè)模塊之間的通信模型是網(wǎng)狀模型,如圖2所示,我們在這里使用了星型模型,通過設(shè)立了一個(gè)消息代理模塊作為各個(gè)模塊通信的中轉(zhuǎn)站,各個(gè)模塊只需要和消息代理模塊建立連接即可,由消息代理模塊完成消息的發(fā)送。
模塊和消息代理之間是C/S關(guān)系,業(yè)務(wù)模塊是客戶端,消息代理模塊是服務(wù)器端。它們之間的通信方式包括兩種類型,一種是直接消息通信,另外一種是訂閱發(fā)布模型。 直接消息通信用于1對1的通信,而訂閱發(fā)布則用于多對1的通信,比如接口模塊檢測到網(wǎng)絡(luò)接口的Up/down狀態(tài)后,需要通知給多個(gè)模塊進(jìn)行相應(yīng)處理。
圖2 星型通信模型
2.2 縱向松耦合設(shè)計(jì)
縱向耦合設(shè)計(jì)主要是為了解決嵌入式軟件在不同操作系統(tǒng)內(nèi)核和硬件平臺(商用芯片,網(wǎng)絡(luò)處理器)的可移植性。首先對于操作系統(tǒng),我們在這里主要考慮linux和vxworks。這兩個(gè)操作系統(tǒng)在任務(wù)管理和內(nèi)存管理方面相差比較多,如何做到軟件在這兩個(gè)系統(tǒng)間切換時(shí)候,修改工作量較?。欢鴮τ谏逃眯酒?,由于各個(gè)廠家芯片提供的API接口也是各不相同。如圖1所示,我們在消息代理器增加了兩個(gè)抽象層,一個(gè)是硬件抽象層,一個(gè)是平臺抽象層,這兩層都是兩個(gè)不同的任務(wù),它們和業(yè)務(wù)模塊之間通過消息代理器進(jìn)行通信。
HAL:主要是對芯片的抽象,業(yè)務(wù)模塊有些信息需要寫入到芯片中,比如路由信息等。HAL層通過接收到業(yè)務(wù)模塊發(fā)來的路由信息,需要進(jìn)行整合和適配到不同芯片,以實(shí)現(xiàn)跨芯片的無縫移植。
PAL:主要實(shí)現(xiàn)了內(nèi)存管理的適配,以及與內(nèi)核通信的適配,為不同內(nèi)核提供了不同的通信方式。業(yè)務(wù)模塊通過PAL層與內(nèi)核進(jìn)行通信,獲取相關(guān)信息。
3 消息代理器
從上面介紹可以看出,整個(gè)松耦合系統(tǒng)設(shè)計(jì)的核心就是消息代理器,它完成了各個(gè)業(yè)務(wù)模塊之間的通信,同時(shí)也是連接底層操作系統(tǒng)內(nèi)核以及硬件的通道。消息代理器的設(shè)計(jì)主要分為三個(gè)部分。客戶端,服務(wù)器端,消息處理。各個(gè)部分的作用如下:
客戶端:業(yè)務(wù)模塊通過客戶端向服務(wù)器注冊,并且訂閱感興趣公共消息類型。
服務(wù)器端:服務(wù)器端偵聽各個(gè)業(yè)務(wù)模塊的注冊信息,并且維護(hù)各個(gè)客戶端的信息,并進(jìn)行消息的發(fā)送與接受。
消息處理端:主要提供對服務(wù)器端和客戶端之間消息的封裝與解封裝。
消息代理器的工作過程如下:3.1 初始化過程,包括服務(wù)器端的初始化和客戶端的初始化,客戶端的初始化由各個(gè)業(yè)務(wù)模塊完成,每個(gè)業(yè)務(wù)模塊都初始化一個(gè)客戶端的實(shí)例。3.2 客戶端發(fā)起連接,服務(wù)器端收到連接后需要對連接成功的客戶端建立一個(gè)鏈表,用來保存客戶端信息,為后續(xù)通信做準(zhǔn)備。3.3 客戶端與服務(wù)器端通信。通信由業(yè)務(wù)模塊發(fā)起,消息處理端進(jìn)行消息的封裝,封裝完后,發(fā)送給服務(wù)期端,服務(wù)器端根據(jù)保存的客戶端鏈表來確認(rèn)消息是從哪個(gè)客戶端發(fā)來的,然后進(jìn)行對應(yīng)的回調(diào)處理。
圖3 消息代理器初始化過程
圖4 客戶端向服務(wù)器發(fā)起連接流程
4 總結(jié)與展望
通過將各個(gè)業(yè)務(wù)模塊設(shè)計(jì)成刀片式的應(yīng)用,并借助于消息代理器將業(yè)務(wù)模塊之間的通信模型改成星型模型,減少了模塊之間的連接關(guān)系。消息代理器 是本設(shè)計(jì)中最重要的組成部分,對整個(gè)框架起了基礎(chǔ)性的作用,其也可單獨(dú)作為一個(gè)獨(dú)立的模塊運(yùn)行。
使用松耦合開發(fā)模式是開發(fā)一個(gè)高可移植性,高可擴(kuò)展性系統(tǒng)的關(guān)鍵所在,本文在嵌入式軟件設(shè)計(jì)的基礎(chǔ)上,提出了模塊間的橫向松耦合以及軟件與嵌入式操作系統(tǒng),硬件平臺的縱向松耦合設(shè)計(jì),并且進(jìn)行了實(shí)現(xiàn)。適合應(yīng)用在通信產(chǎn)品的嵌入式軟件開發(fā)上,而需要把該系統(tǒng)運(yùn)行在不同操作系統(tǒng)的產(chǎn)品上時(shí),其更有用武之地。
參考文獻(xiàn):
[1]李善平,劉文峰,王煥龍.Linux與嵌入式系統(tǒng)(2).北京:清華大學(xué)出版社,2006.3,208~211
[2]Kurt Wall等.GNU/Linux編程指南(2).張輝譯.北京:清華大學(xué)出版社,2002.6,372~390
[3]Neil Matthew,Richard Stones.Linux程序設(shè)計(jì)(3).陳健,宋健健等譯.北京:人民郵電出版社,2007.7,
[4]Barbara H. Liskov and Jeannette M. Wing, A Behavioral Notion of Subtyping, ACM Transactions on Programming Languages and Systems, November 1994.
[5]Barbara Liskov and Jeannette M. Wing, Family Values: A Behavioral Notion of Subtyping, CMU-CS-93-187 (supersedes CMU-CS-93-149 and CMU-CS-92-220)
[6]Boehm, Barry, Ellis Horowitz, Ray Madachy, Donald Reifer, Bradford Clark, Bert Steece, A. Winsor Brown, Sunita Chualani, and Chris Abts. Software Cost Estimation with Cocomo II. Upper Saddle River, NJ: Prentice Hall,January 2000
[作者簡介]曾紅李(1982- ),男,碩士,中興通訊股份有限責(zé)任公司,二級主任工程師,主要研究方向:數(shù)通產(chǎn)品軟件系統(tǒng)設(shè)計(jì)。
計(jì)算機(jī)光盤軟件與應(yīng)用2012年24期