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