本文主要介紹了一種基于事件驅動、采用模塊化分層設計原則的嵌入式系統架構設計方法,可有效提高儀表的穩定性及簡化后期的維護工作。
靳苗、郭月明、衛乾、唐杰
北京昌平,102200)
摘要:本文介紹了一種基于事件驅動的嵌入式系統架構設計方法,該架構采用模塊化分層設計原則,系統架構由硬件抽象層、應用支持子層、應用層、事件驅動核心等部分組成,各層間逐級調用,可以廣泛運行在MSP430、M3、Arm、X86等架構上,具備普遍的通用性;該架構充分考慮智能儀表的需求特點,可有效提高儀表的穩定性及簡化后期的維護工作。
關鍵詞:事件驅動;分層設計;模塊化;函數庫
Embedded Systems Architecture Design of Intelligentinstrument based on Event driven
Abstract:
This article is to introduce an eventdriven based frame design for embedded system, which employs classified modulesdesign. This design consists of Hardware Abstract Layer, Application SupportSub-Layer,? Application Support Layer, and Core of Event Driven. It responds tothe command layer by layer and that promises its wide availability on MSP430, M3, Arm, and X86 frames. This frame is designed particularly for intelligentinstruments and it is very challenging to have constant control and simplifiedmaintenance.
Keys:event driven, layereddesign, modularity, function library
0?
引言
隨著油氣生產物聯網的迅猛發展,智能儀表設備被廣泛應用在國內外自動化領域。但由于自動化行業所使用儀表的開發環境差異較大、產品技術分支多,導致嵌入式代碼接口不統一,代碼重用性較差,增加了后期技術溝通的難度。同時,隨著儀表類產品行業的需求細化、硬件模塊化接口的標準化,對儀表類產品進行統一的嵌入式系統架構設計是可行且必要的。
本文介紹的基于事件驅動的嵌入式系統架構設計方法采用分層設計原則,實現功能模塊化封裝,以最大程度保證系統的穩定和接口的統一,可以方便的移植至其它MCU及儀表平臺,用戶通過簡單宏定義即可實現產品必要的功能選擇,抽象各功能組件的接口并實現統一,可以方便的擴展其它功能組件或增加事件處理任務。
1?
系統架構功能組件及分層設計
1.1 系統架構功能需求
根據目前智能儀表的行業需求,智能儀表需要實現設備管理、人機交互、數據上傳等功能,按照功能模塊化劃分,具體系統功能組件如圖1-1所示。
圖1-1 智能儀表系統功能組件圖
早在1979年,國際標準化組織ISO下設的一個專門委員會為制定“開放系統互聯”(OSI)的有關標準,提出了基于功能分層概念的網絡結構七層模型-開放系統互連參考模型(OSI/RM)。盡管OSI/RM是為網絡中系統互連所建立的,但是其分層的設計思想完全可以為智能儀表嵌入式系統架構的設計所借鑒[5]。
早在1979年,國際標準化組織ISO下設的一個專門委員會為制定“開放系統互聯”(OSI)的有關標準,提出了基于功能分層概念的網絡結構七層模型-開放系統互連參考模型(OSI/RM)。盡管OSI/RM是為網絡中系統互連所建立的,但是其分層的設計思想完全可以為智能儀表嵌入式系統架構的設計所借鑒[5]。
圖1-2 嵌入式系統架構分層圖
2?
系統各層的工作原理分析與設計
由系統分層的設計思想可知,系統中每層都對下一層進行了封裝,因此在代碼執行過程中需要逐級調用,而不能隔層調用。具體各層間的調用流程如2-1所示。
隨著儀表硬件模塊化和接口標準化的落實,為軟件分層模塊化設計奠定了基礎。根據儀表功能需求,硬件層分為主控模塊、傳感器模塊、HMI模塊及通訊模塊等基本單元。
圖2-1 系統各層間調用流程圖
2.1 硬件抽象層(HAL)
2.1.1 硬件抽象層工作原理
硬件抽象層(HAL)完成了對硬件模塊接口的進一步封裝,其中包括MCU內部總線類設備及MCU外部設備,硬件抽象層(HAL)作為BSP的上一層,及應用支持子層的下一層,是整個系統架構非常關鍵的一層,HAL實現了對底層設備的封裝,為應用支持子層及系統架構中其它功能模塊提供統一的接口。為實現該功能及代碼的通用性,需要對每一個軟硬件模塊進行唯一編碼,通過設備編碼實現對不同設備的區別,根據設備編碼通過回調函數的動態映射實現同一設備不同的操作。
根據儀表的特征,可以將對設備的操作抽象成一些子操作接口,將這些子操作統一到一個結構中去來實現對上層接口的統一。如對常規設備的操作可以抽象成打開、讀、寫、休眠、診斷、關閉6個子操作接口,硬件抽象層常規設備接口設計如圖2-2所示,在編寫設備抽象層代碼時,必須將BSP層接口抽象出以上6種接口供應用支持子層及其它功能模塊使用,設備操作結構設計如下:
?
?
Struct Hal_Dev{ ?.DEV_CODE, ?.read, ?.write, ?.open, ?.close, ?.diagnostic, ?.sleep ?}
?
?
圖2-2 硬件抽象層常規設備結構接口設計圖
在實際編寫硬件抽象層驅動式,可通過open函數來掛載不同的操作接口。例如應用支持子層如果需要對硬件抽象層傳感器模塊中的某一子設備進行操作時,首先將該子設備的編碼(設備編碼是全局唯一的)傳入open函數,open函數則根據唯一編碼查找到該設備的操作接口并將其地址賦值給結構中的接口。
2.1.2 硬件抽象層中斷處理接口
為及時響應用戶需求,硬件抽象層可對紅外接口、通訊模塊接口提供了中斷處理機制,涉及中斷處理的模塊有紅外通訊模塊、本地通訊模塊及遠程通信模塊等。在本次系統架構設計中,中斷只有定時器中斷和UART數據接收中斷兩種,定時器中斷用于驅動事件運轉,UART中斷發生時用于搬運UART緩沖區中的數據至數據區。RTC中斷觸發時和UART中斷觸發時的事件流程圖分別如圖2-3、2-4所示。
圖2-3 ?RTC中斷觸發時事件流程圖
圖2-4 UART中斷觸發時事件流程圖
2.2?應用支持子層
應用支持子層是整個系統的第二樞紐,應用支持子層提供了設備硬件抽象層與應用層之間及儀表組函數庫之間的連接,在層級職能上該層對硬件抽象做了進一步的封裝,以便于應用層封裝事件操作接口時調用,主要由傳感器操作相關操作接口、數據存取相關操作接口、數據展示相關操作接口及數據傳輸相關操作接口組成。與儀表組函數庫提供的接口相比,該層級接口偏重于硬件接口封裝,它作為一個橋梁建立了系統其它功能組件與事件驅動核心之間的聯系,為應用層和事件驅動核心提供更加易于使用的設備接口。
以傳感器模塊接口為例。整個系統運轉過程中,傳感器操作是最頻繁的一個任務,整個系統基本上是圍繞著傳感器進行的,根據硬件模塊化設計的方案可以確定傳感器的操作涉及到實時數據讀取、傳感器信息讀取、傳感器診斷共計3個方面,對于MCU來講其實是對SPI接口的一些讀寫操作,而這些讀寫基本操作在HAL中已經實現,本處需要設計一個接口,用來封裝對傳感器實時數據讀取、傳感器信息讀取、工況診斷等操作,如圖2-5所示。
圖2-5 傳感器模塊應用支持子層接口
2.3 儀表函數庫
儀表函數庫實現了對儀表類產品軟件模塊的封裝,主要包含通訊協議模塊、文件系統、設備管理模塊、算法模塊、智能電源管理模塊等,同時包含C語言部分標準函數,該套系統架構支持標準C函數庫中的輸入、輸出函數及數學函數。
通過代碼庫建設,可以統一代碼規范,統一常用函數接口,并避免重用性,提高嵌入式軟件工程師的效率
2.4?應用層
不同的設備有不同的應用場景,相同的設備又有不同的應用需求,如何系統架構的統一,盡量將程序員的工作量集中在實際問題處理上,而不是整個系統上?這要依賴于應用層的設計,應用層將實例化出人機交互事件、設備遠程管理事件、數據上傳事件、數據展示事件、實時數據采集事件、外部設備數據采集事件及歷史數據存取事件等操作接口。在事件驅動中心中將執行上述事件處理函數,應用層及各層之間的關系如圖2-7所示。如傳感器數據上傳事件,該事件工作主要粉兩個方面,一是被動上傳,即上位機有需求時啟動上傳,這種方式主要是應用于總分架構的總線中;另一方面是主動上傳,這要根據具體的通訊協議,如A11通訊協議。同時在該事件中完成數據的合包與發送,該事件將調用通訊協議接口及通訊模塊數據發送接口。
圖2-7 應用層與各層之間的關系圖
2.5 事件驅動核心
事件驅動核心的主要功能是仲裁系統中各個任務的先后順序。事件驅動核心的“心跳”在硬件抽象層完成,通過RTC時鐘滴答進行判斷或觸發事件,設計這一部分目的是讓應用層工程師專注于用戶需求,因為大多數情況下,事件驅動核心及相關子層的設計是整個系統的核心任務,可以通過定期的維護和更新這個“內核”對產品進行升級。事件驅動核心與各層之間的關系如圖2-8所示。
圖2-8 事件驅動核心與各層之間的關系圖
基于事件間的驅動接口可采用結構Event進行封裝,該結構包含了當前事件和上一事件的信息,同時可以在事件之間傳輸數據指針,如下所示:
?
?
Struct Event{ CurrentEvent, .PreEvent, Pdata }
?
?
3?
結束語
本文介紹的分層設計、逐級調用的代碼架構設計方法已經在新一代的智能儀表中使用,并取得了明顯的效果。在智能儀表的軟件代碼設計中,利用這種分層的系統架構設計有如下優點:
(1)提高軟件質量,縮短產品的開發周期。在儀表開發期,統一的函數接口和常用算法的統一管理,大大提高代碼的可重用性,避免重復開發,從而進一步提升開發人員利用率,減少嵌入式代碼工程師的工作量,縮短了產品的開發時間。
(2)簡化設備后期的升級維護。在儀表維護期,清晰的程序結構和統一的接口可有效避免潛伏的BUG,提高產品的穩定性;在更改層的具體實現代碼時,只要函數接口保持穩定,則不必修改其它函數,大大簡化產品的升級維護工作。
參考文獻:
[1] 賈靈,王薪宇,鄭淑軍,等物聯網/無線傳感網原理與實踐[M].北京航空航天大學出版社,2011,1.
[2] 孟彥京,陳卓,事件驅動的程序設計方法在嵌入式系統中的應用[J].電氣自動化,2009年06期.
[3] 李臣亮,事件驅動架構及應用[J].軟件世界,2007年21期
[4] 何鴻君,曹四化,褚祖高,羅莉,寧京宜,董黎明,李朋,一種改進的事件驅動系統框架[J].國防科技大學學報,2008年03期
[5] 孫秋冬,軟件系統的分層設計[J].計算機工程與應用,2001年第7期
作者 |?靳苗、郭月明、衛乾、唐杰
作者簡介:靳苗,女,1986年4月,北京中油瑞飛信息技術有限責任公司,碩士,嵌入式軟件工程師,主要研究方向為嵌入式系統及物聯網技術在油氣生產方面的應用。
郭月明,男,北京中油瑞飛信息技術有限責任公司。
衛乾,男,北京中油瑞飛信息技術有限責任公司。
唐杰,男,北京中油瑞飛信息技術有限責任公司。
審核編輯:黃飛
?
評論
查看更多