摘 要:介紹了一種基于面向對象技術和設計模式的信集閉系統監(jiān)控分站KJF8002嵌入式軟件設計方法描述了面向對象技術和設計模式的實現機制,分析了面向對象和模式在嵌入式軟件設計中的應用和優(yōu)點,并給出了基于面向對象的嵌入式軟件設計的模型。
關鍵詞:面向對象;設計模式;嵌入式;KJF8002
中圖分類號:TD355.4
隨著計算機的發(fā)展,嵌入式技術已經在諸多行業(yè)得到廣泛的應用,而嵌入式軟件又是嵌入式產品中尤為重要的一部分。由于其自身的特殊性,以往嵌入式軟件的設計都采用面向過程的技術和方法,但面向過程的技術和方法本身的缺陷使得嵌入式軟件設計產生了諸如模塊化程度低、代碼重用困難、維護成本高、可擴展性差等諸多問題。面向對象的類、封裝、繼承等方法可以很好地解決由于面向過程的方法自身的缺陷所帶來的諸多問題,設計模式族的應用可以大幅提高代碼重用度,避免重復開發(fā),縮短開發(fā)周期。
本文介紹了將面向對象技術和方法應用到KJF8002監(jiān)控分站嵌入式軟件設計的方法和過程,描述了面向對象和模式在設計中的實現機制,并給出了一種基于面向對象和模式的嵌入式軟件設計的模型。
1 KJF8002軟件與模式架構
KJF8002監(jiān)控分站的軟件架構采用自底向上分層封裝的形式,如圖1所示,底層向上一層提供相應的服務,并接受上層的訪問。在業(yè)務層將處理不同業(yè)務功能的模塊分別封裝成子類,將處理各自功能的接口封裝在類內部,使得各業(yè)務類之間耦合度降低,已達到高內聚低耦合的效果,同時把將來有可能變化的信息進行單獨封裝隔離,在有變化時可使代碼修改量達到最少,降低了代碼的維護成本,且不會因為變化模塊的修改而影響其他模塊。
業(yè)務層與硬件層之間封裝了一層HAL(硬件抽象層)層,HAL充當了BSP(板級支持包)的角色,使應用與具體的硬件相隔離,不會因為底層硬件的改動而影響應用層。同時將硬件驅動單獨封裝,驅動層的代碼采用統一標準化的設計,在采用同系列硬件設計的產品上可以不做修改或做少量修改的應用。
圖1 KJF8002監(jiān)控分站軟件架構
2 設計模式實現機制
2.1 硬件代理模式
硬件代理模式,為應用程序提供一種硬件代理來負責訪問或控制硬件設備。如圖2所示,為硬件代理模式的結構。通常,硬件代理模式應該包括對某種硬件設備的所有操作接口,一般情況下一種硬件代理只能用在一種硬件設備上,但區(qū)分開不同的硬件設備意味著可以分別獨立的對它們進行維護,并且能夠靈活的應對將來的變化。
圖2 硬件代理模式結構
協作角色:
Hardware Device—具體的硬件設備。
Access()—為應用程序提供訪問具體設備的方法。
Configure()—提供配置具體設備的方法。
Control()—提供控制具體設備的方法。
Disable()—上層應用調用此接口關閉對某個設備的訪問。Initialize()—用于初始化具體設備。
應用效果:
該模式結構簡單且易于實現,它具有封裝硬件接口以及編碼細節(jié)的所有優(yōu)點。封裝完全隱藏了底層的實現細節(jié),使底層硬件與上層應用相隔離,這為將來硬件接口的改變提供了靈活性。
2.2 輪詢模式
KJF8002監(jiān)控分站下屬子設備眾多,對子設備的管理和訪問采用輪詢模式,輪詢模式結構如圖3,輪詢是從硬件設備或傳感器獲取數據和信號的一種常用模式。KJF8002監(jiān)控分站采用對稱機會輪詢和定期輪詢相結合的方式,除電子顯示牌等不需要經常詢問的設備采用定輪詢外,其他設備均采用對稱機會輪詢。
圖3 輪詢模式結構
2.2.1 協作角色
Poller—管理并維護一個輪詢設備的循環(huán)鏈表和兩個接口函數,其中,LinkList設備鏈表管理和維護設備的類型、起始地址、終止地址以及當前巡檢設備的種類、地址等情況;CurrentPollDeviceSearch接口函數用于查找當前應該巡檢的設備;DevicePolling接口函數啟動設備巡檢,并對機會輪詢模式和定期輪詢模式進行裁決。
PollDataClient—封裝了設備數據處理接口DeviceDataHandle和設備狀態(tài)處理接口DeviceStateHandle。
硬件代理—輪詢模式可以與硬件代理及中介者模式相結合使用,在訪問底層硬件設備時,Poller并不是直接訪問底層硬件設備,而是通過硬件代理間接訪問。同時獲得的數據狀態(tài)信息可以通過中介者供其他設備使用,也可通過中介者獲取自身感興趣的信息。
2.2.2 應用效果
輪詢模式能夠同時監(jiān)測多種設備的狀態(tài)和數據信息的改變,由于本文介紹的KJF8002監(jiān)控分站應用的場合均為數據輪詢時間加設備反應時間小于設計的最終期限,所以不需要考慮由于數據到達快于輪詢時間而造成的數據丟失現象。
2.3 狀態(tài)機模式
狀態(tài)機,是由狀態(tài)、轉換、動作這三個主要元素組成的有向圖。KJF8002監(jiān)控分站在獲取子設備的狀態(tài)、數據信息時采用狀態(tài)機模式,其結構如圖4所示,狀態(tài)機模式的采用可以是與特定狀態(tài)相關的行為局部化,并將不同的狀態(tài)行為相互隔離開來,可以大幅度的降低維護難度和提高擴展性。
圖4 狀態(tài)機模式結構
2.3.1 協作角色
EventList—狀態(tài)列表,它維護了所有識別事件屬性的狀態(tài),在利用C語言開發(fā)的環(huán)境中通常是enum枚舉結構。
StateMachine—狀態(tài)機類,它獲取不同的事件屬性狀態(tài),并根據不同的狀態(tài)調用不同的處理函數,同時進行狀態(tài)轉換。
事件處理函數—HandleStateA、HandleStateB、HandleStateC,分別封裝了針對不同狀態(tài)而執(zhí)行的行為動作,包括數據的存儲、校驗和錯誤處理等。
2.3.2 應用效果
狀態(tài)機模式單獨維護狀態(tài)列表,并將對應的處理狀態(tài)邏輯的行為分散封裝,減少了狀態(tài)之間的相互依賴性。由于相互獨立的封裝形式可以為新狀態(tài)的插入或原有狀態(tài)的刪除提供極大的靈活性,同時在編碼方面可以消除由于龐大的條件語句分支而帶來難以修改和擴展的問題。
2.4 中介者模式
KJF8002監(jiān)控分站掛接多種子設備,在對一種設備的控制時需要根據另一種設備的數據和狀態(tài)信息,雖然將每個設備的單獨封裝為數據處理對象可以增大代碼的復用度,但設備對象間頻繁的直接交互勢必會增加對象間的耦合度。中介者模式封裝了一系列設備對象間交互的方法,使得各設備對象在交互時不需要直接相互引用。中介者模式結構如圖5所示,中介者模式可以與硬件代理模式結合使用提高代碼修改和擴展的靈活度。
圖5 中介者模式結構
2.4.1 協作角色
Mediator—中介者封裝了硬件設備間交互的方法和交互數據,它維護者各個硬件設備感興趣的數據,并提供給他們訪問這些數據的方法接口,它隱藏了數據獲取的細節(jié),而對于硬件設備,它們只關心自己感興趣的那部分數據,而完全不了解其他設備的存在。
HardwareProxy—硬件代理,一方面從中介者對象那里獲取有用信息,另一方面將代理的硬件的狀態(tài)、數據信息反饋給中介者對象。
HardwareDevice—具體的硬件設備對象。
2.4.2 應用效果
中介者模式創(chuàng)建中介者對象來協調硬件設備間的交互,而不需要直接耦合硬件設備。單獨的硬件設備只需要通過中介者獲取自身關注的信息,不需要與信息的產生設備產生直接的關系,在KJF8002監(jiān)控分站中,控制硬件設備邏輯信息有其他硬件產生并由中介者進行分類維護,在硬件設備需要獲取自身關注的邏輯信息時提供相應的處理接口。中介者模式將復雜的處理集中封裝在中介者內部,降低了硬件設備之間的耦合度,使對代碼的維護集中著一點,相應的在擴展交互時只需要在中介者內部添加相應的數據項和處理接口即可,使擴展性、維護性和復用性得到最大的優(yōu)化。
3 應用模型
在具體的代碼設計時,分別對硬件訪問、數據收發(fā)、設備交互等問題采用硬件代理模式、輪詢模式、狀態(tài)機模式和中介者模式等設計模式方法,設計模式模型架構如圖6,上層應用采用輪詢的方式訪問和管理子設備,硬件代理模式封裝了所有硬件設備訪問,允許上層應用通過代理對子設備進行讀寫數據,以及初始化、配置和注銷對設備的管理和訪問,代理為上層應用提供編碼和連接無關的接口,因此在子設備變化時,易于修改。在從子設備獲取數據或向子設備發(fā)送數據時,采用狀態(tài)機模式,上層應用通過監(jiān)測子設備的當前狀態(tài)來啟動數據傳輸,在設備故障時采用柔性的巡檢方式,以避免對故障設備頻繁的訪問而造成的時間消耗。在獲取設備發(fā)送的數據時,根據設備傳送數據的不同狀態(tài)階段和檢錯機制來提高軟件的容錯性。在對子設備進行控制時,對一種設備的控制需要根據另一種設備的狀態(tài)和數據信息,為了使設備間能協調協作,采用了中介者模式。中介者模式提供一種在一組元素中復雜交互協調的方法。它使用一個中介類協調設備集合的行為來達到所需的控制效果。
模式的使用使得嵌入式產品中經常遇到的相同問題獲得了通解,在以后的產品開發(fā)中可以直接套用相關模式以減少工作量、縮短開發(fā)周期。
圖6 KJF8002監(jiān)控分站軟件模式架構
4 結束語
使用面向對象方法和模式設計嵌入式軟件是一種全新的設計理念,基于該理念設計的嵌入式軟件具有高效的可重用性和擴展性,層間和模塊間耦合性小便于維護,設計完成的代碼模塊可以很容易的移植到其他的應用場合,從而縮短了開發(fā)周期,避免了代碼的重復開發(fā)。
本文以KJF8002監(jiān)控分站的嵌入式軟件設計為例,詳細說明了基于面向對象和模式的嵌入式軟件設計方法,描述了幾種模式在應用中的實現機制,同時給出了模式設計的應用架構模型。面向對象和模式的設計方法在KJF8002監(jiān)控分站軟件中的成功應用表明,這種思想和方法具有強大的生命力和適用性,在嵌入式軟件設計中有較高的價值和推廣性。
參考文獻:
[1]劉剛,邵志清,肖立中.嵌入式系統開發(fā)中的設計模式[J].計算機應用,2006(09):2236-2237.
[2]肖芳雄,熊光澤,繆敬.面向對象和模式在嵌入式軟件中的應用[J].計算機工程,2003(22):56-58.
[3]肖芳雄,熊光澤,謝鑫.一種面向對象嵌入式軟件開發(fā)平臺的設計和實現[J].計算機應用,2003(12Z):341-343.
[4]王江濤.觀察者設計模式在嵌入式系統中的應用[J].計算機工程,2004(增刊):66-68.
[5]王曉慶,曾文英,王明文.設計模式中的面向對象原則及其子模式[J].計算機工程,2003(09):192-194.
[6]朱進.面向對象設計模式的C語言實現[J].微機發(fā)展,2005(11):99-101
作者簡介:涂帥(1981-),男,安徽六安人,助理工程師,碩士,現主要從事煤礦監(jiān)測監(jiān)控產品研發(fā)工作。
作者單位:中煤科工集團常州自動化研究院,江蘇常州 213015
基金項目:天地(常州)自動化股份有限公司研發(fā)項目(項目編號:13SY012-01)。