馬若飛 楊 柳 雷連發(fā)
(西安電子工程研究所 西安 710100)
嵌入式軟件相比桌面計算機應(yīng)用軟件,具有更高的軟硬件結(jié)合度,是為了嵌入特定功能的硬件中,圍繞該硬件系統(tǒng)中的嵌入式微處理器和外圍硬件設(shè)備,完成對該硬件系統(tǒng)的控制、監(jiān)視,以及該系統(tǒng)要求完成的其他通信、處理類任務(wù)[1-2]。由于嵌入式軟件與硬件系統(tǒng)的這種強結(jié)合性,隨著硬件系統(tǒng)的變更,嵌入式軟件就要做相應(yīng)的調(diào)整,使得嵌入式軟件在通用性、復(fù)用性、可移植性方面沒有桌面計算機軟件有優(yōu)勢。隨著嵌入式軟件功能的增強,軟件開發(fā)周期的縮短,以往定制型的軟件開發(fā)方式很難適應(yīng)系統(tǒng)的要求[3]。本文通過對嵌入式實時多任務(wù)軟件的研究分析,針對嵌入式實時多任務(wù)軟件的跨平臺特性和模塊化特性,設(shè)計了一種軟件框架,實現(xiàn)了嵌入式實時多任務(wù)軟件通用性、復(fù)用性、可移植性方面的提高。
隨著嵌入式微處理器性能的大幅提升,以及嵌入式系統(tǒng)對通信和處理類功能的要求越來越高,嵌入式實時多任務(wù)軟件開始發(fā)展成為主流[4]。嵌入式實時多任務(wù)軟件主要由三部分組成:嵌入式實時多任務(wù)操作系統(tǒng)(RTOS)、板級支撐軟件(BSP)、應(yīng)用軟件(Application)。
嵌入式實時多任務(wù)軟件具有以下特點:
1)軟件對響應(yīng)時間有非常嚴(yán)格的要求,必須在限定的時間內(nèi)完成要求的功能,并且對外部傳來的異步事件也要具有及時響應(yīng)的能力,這樣就要求系統(tǒng)本身的處理開銷小,進程調(diào)度及進程間通信處理實時有效,占用的時延要短。
2)軟件和硬件結(jié)合度高,整個軟件系統(tǒng)都是根據(jù)已有硬件系統(tǒng)進行相應(yīng)的裁剪和配置。如果硬件系統(tǒng)發(fā)生了變更,軟件系統(tǒng)也要做相應(yīng)的變更,導(dǎo)致嵌入式實時多任務(wù)軟件的跨平臺性、通行性及復(fù)用性都沒有PC機軟件強[5]。
鑒于嵌入式實時多任務(wù)軟件的特點,目前比較常用的有以下幾種操作系統(tǒng):
1)VxWorks:是由美國風(fēng)河(WindRiver)軟件公司設(shè)計開發(fā)的一款高性能嵌入式實時多任務(wù)操作系統(tǒng)。VxWorks具有可裁剪的微內(nèi)核結(jié)構(gòu)、有效的任務(wù)管理、靈活的任務(wù)間通信、微秒級的終端處理能力以及對多種通信協(xié)議、任務(wù)系統(tǒng)的支持能力。由于以上優(yōu)點,該操作系統(tǒng)已經(jīng)成功應(yīng)用于航空航天、國防、通信、醫(yī)療等對實時性要求極高的尖端領(lǐng)域[6]。
2)Linux:是一種源代碼公開的高性能嵌入式實時多任務(wù)操作系統(tǒng),其最大的特點就是源代碼公開,并且有大量優(yōu)秀免費的開發(fā)工具及應(yīng)用軟件可供選擇和參考。目前Linux已經(jīng)發(fā)展成為一種高性能、穩(wěn)定、設(shè)計完善、多平臺、技術(shù)支持豐富的優(yōu)勢嵌入式操作系統(tǒng)[7]。
3)μC/OS-Ⅱ:是一種專門為了嵌入式系統(tǒng)設(shè)計,并且源代碼公開的著名實時內(nèi)核, 可運行于不同處理位寬的微處理器、微控制器及數(shù)字信號處理器(DSP)上。具有結(jié)構(gòu)小巧、代碼的執(zhí)行效率高、占用內(nèi)存空間小、實時性強等特點,特別適合用對實時性要求高的小型嵌入式系統(tǒng)[8]。
由于目前嵌入式系統(tǒng)的這種操作系統(tǒng)+板級支撐軟件+應(yīng)用程序的結(jié)構(gòu),導(dǎo)致應(yīng)用軟件跨平臺性和復(fù)用性較差,當(dāng)選擇的操作系統(tǒng)發(fā)生了變更,甚至操作系統(tǒng)沒有變更,只是具有相同功能的硬件系統(tǒng)發(fā)生了變更也會導(dǎo)致板級支撐軟件發(fā)生變更,即使上層應(yīng)用軟件的需求沒有變化,也會導(dǎo)致應(yīng)用軟件為了適用新的操作系統(tǒng)或者新的板級支撐軟件做大量的修改,增加了應(yīng)用軟件的復(fù)雜性和可靠性,也增加了應(yīng)用軟件設(shè)計人員的工作量。所以,良好的跨平臺性對應(yīng)用軟件開發(fā)具有非常重要的意義。
隨著嵌入式系統(tǒng)的復(fù)雜性越來越高,嵌入式應(yīng)用軟件的代碼量和復(fù)雜性也越來越高,同時軟件的可靠性也越來越受到關(guān)注。為了提高軟件開發(fā)的效率和軟件產(chǎn)品的可靠性,模塊化設(shè)計是一種有效通用的設(shè)計方法。將整個軟件產(chǎn)品按照功能、流程劃分成各個功能清晰、接口明確的軟件模塊,對各個模塊獨立開發(fā)和測試驗證,最后將模塊進行匹配合成,最終完成嵌入式系統(tǒng)對軟件的需求。按照模塊化的開發(fā)方法,可以將已經(jīng)測試、驗證并且使用的軟件模塊作為成熟軟件模塊進行復(fù)用,這樣可以有效縮短軟件開發(fā)的時間,并且有效提高軟件的可靠性[9]。
跨平臺模塊化嵌入式實時多任務(wù)軟件框架的設(shè)計,主要為了滿足嵌入式系統(tǒng)對嵌入式軟件開發(fā)的跨平臺特性需求和模塊化特性需求,作為軟件中間件使用。
按照嵌入式軟件與硬件資源的耦合關(guān)系,將整個軟件劃分為圖1所示幾個層級:操作系統(tǒng)及BSP層、底層封裝層、模塊層、模塊調(diào)度層、應(yīng)用軟件層、公共服務(wù)層。其中,操作系統(tǒng)及BSP層主要是嵌入式實時操作系統(tǒng)自身,以及針對具體硬件資源,根據(jù)軟件系統(tǒng)和操作系統(tǒng)的需求提供的硬件驅(qū)動程序等板級底層支撐軟件。應(yīng)用軟件層主要是根據(jù)系統(tǒng)的需求,完成具體的控制、通信或者處理任務(wù),是整個嵌入式軟件的核心。模塊層中的功能代碼是完成應(yīng)用軟件層要求的具體任務(wù)的功能實現(xiàn)。底層封裝層、模塊層中的模塊封裝、模塊調(diào)度層、公共服務(wù)層都是軟件框架的組成部分,作為一個整體嵌入在應(yīng)用軟件和硬件及操作系統(tǒng)之間,完成對兩者的隔離,以及完成兩者之間的通信聯(lián)系。
通過對該軟件框架的應(yīng)用,可以使嵌入式軟件開發(fā)人員將需要開發(fā)的軟件按照功能模塊,而不是常規(guī)意義的進程對軟件進行劃分、開發(fā)和實時在線管理,并且可以使已經(jīng)經(jīng)過有效驗證和使用的代碼經(jīng)過適量的簡單修改就能夠進行操作系統(tǒng)的移植或者硬件平臺的移植,從而大大減輕軟件開發(fā)人員的工作量,提高軟件開發(fā)的效率和可靠性。
底層封裝層主要是對操作系統(tǒng)和BSP提供的應(yīng)用程序接口(API)函數(shù)的功能和接口進行分析,根據(jù)不同操作系統(tǒng)和不同硬件平臺的特性,提供對主要使用的API函數(shù)的封裝,使應(yīng)用軟件不直接調(diào)用API函數(shù),而是通過封裝的框架函數(shù)間接的調(diào)用,完成對兩者的隔離,這樣可以在操作系統(tǒng)移植或者硬件變更時,只需要根據(jù)新的操作系統(tǒng)或者BSP修改相應(yīng)的封裝函數(shù),應(yīng)用軟件和框架的接口不變,最大限度的減少應(yīng)用軟件的變更。
軟件框架中的模塊層設(shè)計主要是指模塊層中的模塊封裝功能。將軟件要完成的任務(wù)按照功能獨立性劃分成若干個模塊,每個模塊都是功能完備,接口清晰。每一個模塊都要有全局唯一的模塊ID號,并且具備模塊初始化、模塊的加載、模塊的卸載等功能,并且每個功能都要有相應(yīng)的調(diào)用機制,可供模塊調(diào)度層調(diào)配使用。
模塊初始化完成對該模塊中使用到的硬件資源和軟件資源的初始化工作,并且當(dāng)所有初始化功能成功完成后,生成全局唯一的模塊ID號,后續(xù)模塊調(diào)度層對該模塊的加載及卸載都要依據(jù)該模塊ID號進行,方便模塊調(diào)度層的管理。
模塊的加載主要是根據(jù)模塊調(diào)度層的調(diào)用,將該模塊加載到整個應(yīng)用軟件中,以便完成該模塊對應(yīng)的任務(wù)功能。
模塊的卸載主要是根據(jù)模塊調(diào)度層的調(diào)用,停止該模塊的運行,并且釋放該模塊使用的系統(tǒng)資源。
常規(guī)的嵌入式軟件開發(fā)都是以進程作為開發(fā)或者調(diào)用的基本單元,這樣的劃分方式簡單易用,但是進程之間的關(guān)系不夠清晰,當(dāng)軟件系統(tǒng)較復(fù)雜或者進程數(shù)較多時,都給軟件的開發(fā)和維護帶來了很多問題。并且由于缺乏統(tǒng)一的進程管理,經(jīng)過長時間進程的啟動、刪除、進程間通信等操作,使得系統(tǒng)資源和進程的狀態(tài)都較難清晰,導(dǎo)致軟件的可靠性受到威脅。
軟件框架采用功能模塊的劃分方式,將軟件按照系統(tǒng)任務(wù)需求分成若干功能模塊,每個模塊包含完成該功能需要的所有軟硬件資源及進程,并且依據(jù)模塊整體進行統(tǒng)一初始化、加載、卸載等操作。為了保證軟件的可靠性,防止模塊間出現(xiàn)加卸載混亂等問題,模塊的加卸載必須由模塊調(diào)度層完成,并且由模塊調(diào)度層保存各個模塊當(dāng)前的狀態(tài)。當(dāng)出現(xiàn)模塊A具有操作(啟動、刪除、掛起等)模塊B的需求時,模塊A需要向模塊調(diào)度層提出相應(yīng)的申請,模塊調(diào)度層查詢當(dāng)前模塊B的狀態(tài),依據(jù)模塊B當(dāng)前狀態(tài)做出相應(yīng)的處理,并反饋模塊A相應(yīng)結(jié)果,詳細流程見圖2所示。
公共服務(wù)層主要是提供常用的一些基礎(chǔ)功能函數(shù)或者成熟功能軟件塊,如排序、查找、大小端轉(zhuǎn)換等,以便軟件開發(fā)人員可以方便地調(diào)用,減輕軟件開發(fā)人員的工作量。同時,該公共服務(wù)層是可擴展的,軟件開發(fā)人員可以根據(jù)自己的意愿和能力,將經(jīng)過充分測試和驗證的軟件塊添加進來,以便自己和他人調(diào)用。
將該軟件框架應(yīng)用于某試驗系統(tǒng)的數(shù)據(jù)處理器中,完成系統(tǒng)控制、通信控制及數(shù)據(jù)處理等任務(wù)。該數(shù)據(jù)處理器采用以PowerPC微處理器為核心的單板機為硬件載體,采用VxWorks作為該硬件系統(tǒng)的嵌入式操作系統(tǒng),板子BSP由單板機供應(yīng)商提供。
在底層封裝層,將由VxWorks操作系統(tǒng)和BSP提供,并且在軟件開發(fā)過程中主要用到的API函數(shù)都進行了封裝。所有封裝的操作系統(tǒng)的函數(shù)都是用“OS_”起始,如“OS_tickGet”。所有封裝的BSP的函數(shù)都是用“BSP_”起始,如“BSP_WatchDogLoad”。在封裝過程中,考慮到其他常用的嵌入式操作系統(tǒng)(Linux等)中相同或相似功能API函數(shù)的特點,對相應(yīng)的接口留有擴張的余地。如系統(tǒng)函數(shù)STATUS taskDelay(int ticks),用于實現(xiàn)任務(wù)延時功能,輸入?yún)?shù)是系統(tǒng)的tick數(shù),這樣會導(dǎo)致任務(wù)的延時和硬件主頻相關(guān),為了保持通用性,將其功能封裝成只與時間有關(guān)的函數(shù):int OS_taskDelay(int msTimes),如圖3所示。
模塊層中,將整個數(shù)據(jù)處理軟件的任務(wù)劃分成幾個部分:RS422與主控串行數(shù)據(jù)通信模塊[10]、Pcie1與存儲器通信模塊、Pcie2與信號處理通信模塊、系統(tǒng)狀態(tài)控制模塊、數(shù)據(jù)處理模塊、周期處理模塊等。分別對每個模塊使用模塊初始化、模塊加載、模塊卸載等接口供模塊調(diào)度層使用。
在模塊調(diào)度層中,完成對每個模塊的初始化,生成模塊ID號,再根據(jù)模塊ID號完成相應(yīng)模塊的加載和卸載功能。部分模塊調(diào)用接口如圖4所示,模塊調(diào)度層調(diào)度方法及流程如圖5所示。
在公共服務(wù)層中,提供整個數(shù)據(jù)處理軟件中需要使用的基礎(chǔ)函數(shù)和通用處理算法,如排序算法、大小端轉(zhuǎn)換算法、卡爾曼濾波算法等。
在應(yīng)用軟件層,完成系統(tǒng)的上電初始化,并且通過模塊調(diào)度層統(tǒng)領(lǐng)整個數(shù)據(jù)處理軟件的運行,完成整個系統(tǒng)對數(shù)據(jù)處理軟件的需求。
通過在數(shù)據(jù)處理軟件中應(yīng)用該軟件框架,實現(xiàn)了應(yīng)用軟件和處理器硬件平臺的隔離,在項目開展過程中,即使處理器硬件平臺發(fā)生變更的情況下,該數(shù)據(jù)處理軟件也能通過很少的修改就能較好的適配新的處理器平臺。通過將軟件任務(wù)按照功能獨立性封裝成功能模塊并使用模塊調(diào)度層進行功能調(diào)度的處理方法,提高了軟件的模塊化程度和軟件的可靠性。
通過對嵌入式實時多任務(wù)軟件的研究分析,為了獲得嵌入式應(yīng)用軟件良好的擴展性、復(fù)用性和可靠性,軟件的跨平臺特性和模塊化特性是兩個基本需求。在此分析基礎(chǔ)上,設(shè)計了一種跨操作系統(tǒng)平臺和硬件資源平臺,以軟件功能為模塊劃分依據(jù)和加卸載基本單元的軟件框架,實現(xiàn)了上層應(yīng)用軟件與底層硬件、操作系統(tǒng)及BSP的隔離。在某信號偵查系統(tǒng)數(shù)據(jù)處理軟件中應(yīng)用了該軟件框架,實現(xiàn)了數(shù)據(jù)處理軟件良好的跨平臺和模塊化特性,達到了軟件框架預(yù)期的效果。
參考文獻:
[1]劉天泉. 嵌入式系統(tǒng)軟件設(shè)計方法研究及應(yīng)用[D]. 杭州: 浙江大學(xué), 2004.
[2]蔡舒祺. 嵌入式系統(tǒng)安全性分析概述[J]. 電子技術(shù)與軟件工程, 2017(03): 210-212.
[3]劉宇傳, 張華熊, 黃海. 基于Module-MSG的嵌入式軟件框架[J]. 計算機工程與設(shè)計, 2017(07): 1798-1802.
[4]夏一行, 曲琳, 等. 嵌入式數(shù)據(jù)分析類儀器軟件應(yīng)用框架的開發(fā)[J]. 江南大學(xué)學(xué)報(自然科學(xué)版), 2008(03): 258-261.
[5]陳瑋,顧思思. 基于組合算法的嵌入式系統(tǒng)軟硬件劃分方法[J]. 計算機應(yīng)用與軟件 ,2015(10): 240-243.
[6]宋曉麗. 基于Vxworks的數(shù)據(jù)通信及控制技術(shù)的研究與實現(xiàn)[D]. 西安: 西安電子科技大學(xué), 2009.
[7]曹玉華. 基于Linux實時擴展的嵌入式數(shù)控系統(tǒng)研究與開發(fā)[D]. 南京: 南京航天航空大學(xué), 2011.
[8]趙偉. 基于ARM和μC/OS-Ⅱ的功率控制系統(tǒng)軟件開發(fā)[D]. 西安: 西安電子科技大學(xué), 2011.
[9]羅利強, 張艷艷, 高恒. 雷達數(shù)據(jù)處理軟件模塊化研究[J]. 火控雷達技術(shù), 2013, 42(2): 38-41.
[10]馬若飛, 洪偉, 楊柳. 一種高效可靠的串行數(shù)據(jù)通信協(xié)議及處理算法[J]. 火控雷達技術(shù), 2016, 45(2): 52-55.