引言 在過去的10多年里,嵌入式技術得到飛速發展。隨著嵌入式應用的不斷深入,嵌入式系統的復雜性、不確定性在不斷提高,系統規模也在逐步增大;而產品的研發周期又在不斷地縮短,這給嵌入式應用軟件的開發帶來了新的挑戰。因此,最近幾年,對占先式實時內核的研究、開發與應用逐漸成為嵌入式系統的重點研究方向。 面向對象技術由于內在地支持了對系統的抽象、分層和復用技術,能夠很好地控制系統的復雜性,可很好地減輕嵌入式軟件的開發者必然面臨的由于芯片性能的提高、嵌入式操作系統平臺等技術方面不斷變化所帶來的各種壓力,因此在嵌入式領域得到越來越廣泛的應用。其中,統一建模語言是當今世界上面向對象系統開發領域中應用最為廣泛的工具之一。 1 統一建模語言UML 1.1 UML簡介 UML(Unified Modeling Language)是一種標準的、用于面向對象和基于構件的軟件系統建模工具,是一種用于對軟件系統模型繪制可視化描述的工具。UML以標準的、易于理解的方式建立能夠描述復雜系統結構和過程的可視化模型,廣泛用于描述信息管理系統、具有實時要求的工業系統過程、嵌入式系統、分布式系統、系統軟件等。 UML由圖、視圖、模型元素、通用機制和擴展機制等幾個部分組成。其中圖是UML建模的關鍵,視圖由圖來描述;而圖由模型元素結合通用機制、擴展機制等表示和語義組成。 根據圖在系統開發過程中不同階段的應用,可以分為五類:用例圖、靜態圖、行為圖、交互圖與實現圖。 這些圖為系統的分析、設計提供了多種圖形表達形式,應用于建模的不同階段。運用UML。我們可以分析、設計幾乎所有的軟件和非軟件系統。當然,對于具體的系統應該根據系統的類型、系統的規模和開發需要繪制相應的圖,不一定在一個系統中畫出所有種類的圖。 1.2 UML與占先式實時內核 開發一個占先式實時內核與一般軟件的開發一樣,必然要經過開發的分析、設計、編碼、測試四個階段。在嵌入式軟件開發過程中,一般采用的是一種順序開發方法。然而,由于嵌入式產品更新很快,研發周期要求盡可能的短,同時在開發過程中應能動態地調整,所以,開發初斯所做的需求分析和設計,在后期的實現和測試中往往要做變動。這反映了在軟件開發過程中的需求分析、設計與具體實現之間有某種程度上的脫節,對軟件實現后面的驗證往往會帶來很大風險。另外,傳統的嵌入式系統軟件開發環境主要是對開發過程中軟件實現和測試階段的支持,是以源程序的開發和測試為核心的,缺少必要的需求分析和設計工具。 UML為占先式實時內核的設計和實現提供了一套功能強大的建模工具。由于UML融合了面向對象方法中的數據驅動和行為驅動兩種方式,可以從各個方面描述實時系統的功能及反映實時系統的結束條件,可以為具有靜態結構和動態結構的系統以面向對象圖形的方式建模。因此,使用面向對象的UML可以很好地完成占先式實時內核的建模。 圖2 占先式實時內核的類圖 2 UML建模的具體應用 2.1 占先式實時內核概述 占先式實時內核具有多任務機制。多任務機制是基于面向任務對象的,以任務為對象,以事件和時間為驅動,通過實時內核管理時間關鍵任務和任務的優先級,實現任務之間的調度、協同和仲裁。 多任務機制的具體實現由調度程度來完成。在系統程序運行過程中,當前任務完成之后,調度程序調出任務就緒表中優先級最高任務的入口地址,把CPU資源分析給該任務,使之執行。如果該任務在執行過程中引起比它優先級高的任務進入就緒態,或者是中斷服務程序使一個更高優先級任務進入就緒態,調度程序會把任務的當前程序指針、寄存器壓入到該任務的任務堆棧指針指向的棧空間,保證現場,再把CPU資源分配給更高優先級任務,使高優先級任務開始執行。高優先級任務執行完畢后,下一個在任務就緒表中的最高級任務先從該任務的堆棧數據區恢復寄存器、程序指針、程序狀態,然后切換并執行該任務。 采用占先式實時內核的思想設計單片機軟件,可以合理應用單片機的有限資源并達到很高的實時響應,能降低軟件設計的難度。在本設計中,要求占先式實時內核應用于單片機中,任務數量最多不超過16個任務。 占先式實時內核的功能需求是: *支持外部異步事件中斷、定時器中斷、消息傳遞及任務消息到達時的調度; *支持基于任務優先級占先調度,多種實時調度策略; *任務的創建、運行、懸掛、喚醒與撤銷; *定時器時鐘管理,任務延時處理; *共享資源管理,保證任務的同步運行。 由于占先式實時內核主要體現在軟件設計方面,所以在此省略了構件圖和配置圖。 2.2 用例圖 圖1為用例圖,列出了該系統最基本的功能及功能描述,包括一系列用例和從系統中抽象出來的執行者。 (1)角色說明 *任務。是嵌入式系統中用戶想要實現的具體功能,是一個線程。這些功能包括:輸入、輸出、數據處理、通信等。 *中斷。用來通知占先式實時內核有一個事件發生,包括內部非屏蔽中斷、定時器中斷與外部異步時間中斷。 *系統時鐘。用來創建中先式實時核所需要時候節拍。 (2)使用案例說明 *中斷響應。占先式實時內核通過對異步事件的處理,獲得任務運行所需要的信號與數據,使任務得以正常運行。 *中斷級調度。中斷處理使得需要該中斷信號的任務就緒,調度程序判斷該任務是否為當前任務就緒表中最高優先級任務,進而決定該任務否立即進行。 *任務就緒。這里指的不是由于中斷所引起的用戶任務就緒,有兩種方式:一個是,用戶希望應用系統完成某個任務功能時,需要通知占先式實時內核,要求它創建該任務;另一個是,當當前運行的任務喚醒另一個任務時,使后者就緒。 *任務級調度。任務完成創建或被別的任務喚醒之后,調度程序判斷該任務是否為當前任務就緒表中最高優先級任務,進而決定該任務是否立即進行。 *任務運行。當任務是當前任務就緒表中優先級最高的任務時運行該任務。 2.3 類圖 圖2為類圖,包括一組由所討論系統中抽象出的類和它們之間的關系。 類中斷的屬性中,中斷類型包括非屏蔽中斷、外部中斷與定時器中斷,以便占先式實時同核進行相應的中斷處理;中斷向量號與單片機的中斷向量號相匹配;中斷嵌套狀態表明當前中斷是處于哪一層的中斷嵌套中。類中斷有一個操作:中斷處理,獲取外部事件的信號和數據,并使上應的任務就緒,然后判斷中斷嵌套數是否為0。若不為零,執行別的中斷響應;如果為零,選擇相應的調度程序進行調度。 類調度的屬性中,調度策略用于選擇一種實時調度方案;調度類型包括中斷調度與任務級調度;任務就緒表與任務懸掛表是調度時所需要數據結構。類調度有一個操作:調度。當當前任務是任務就緒表中優先級最高的任務時,當前任務繼續運行;如不是,將當前任務運行時的狀態與數據壓入該任務堆棧,掛起該任務,然后調出最高級優先權任務的任務堆棧數據與狀態,使最高級任務運行。 類任務的屬性中,任務ID表明是哪一個任務;任務優先級說明任務在所有任務中的運行優先權;任務狀態說明該任務在占先式實時內核中是處在何種狀態;任務堆棧保存任務切換時該任務的狀態與數據。類任務有四個操作:建立任務,在占先式實時內核中確認該任務;掛起任務,是任務由就緒狀態轉為掛起狀態;恢復任務,是任務由掛起狀態轉為就緒狀態;任務延遲,是任務自我延遲若干個時鐘節拍,同時由就緒狀態轉為掛起狀態。 類消息的屬性中,消息類型包括信號量與消息隊列;消息ID表明該消息是哪一個消息;消息發送任務ID表明消息是由哪個任務發送的;消息接收任務ID表明哪些任務接收該消息。類消息的操作有兩個:發送消息,向一個或幾個任務發送信息;接收消息,消息接收到某個信息。 類任務定時器的屬性中,任務定時器ID表明該定時器是屬于哪個任務的;任務定時器時長說明該任務需要多長時鐘節后才能再次運行。類任務定時器中有兩個操作:時鐘節拍處理,處理任務的延時時鐘節拍;任務超時處理,延時時間到的任務狀態轉為為就緒狀態。 類之間有以下聯系: *中斷與任務之間,描述中斷處理使相應的任務就緒; *中斷與調度之間,描述由于中斷引起的中斷級調度; *中斷與消息之間,描述中斷處理時,相應的消息得到信號或數據; *調度與任務之間,描述由于調度使任務就緒表中優先級最高的任務運行,任務由于等待信號而自我掛起,也會請求調度; *任務與任務定時器之間,描述定時器對任務延遲時間的處理; *任務與消息之間,描述任務對消息的信息請求,消息對任務信息的接收,消息發送使接收該信息的任務就緒; *調度與消息之間,描述由于消息到而請求調度。 2.4 狀態圖 狀態圖表示對象的行為,被用來描述一個系統的動態視圖。由于在占先式實時內核中系統的狀態轉換可以通過任務的狀態轉換顯示出來,所以這里只給出對象任務的狀態務,如圖3所示。 任務在占先式實時內核中具有就緒、運行、掛起三種狀態。任務正在運行時,由于等待消息、自我延時或自我掛起,可以由運行狀態進入掛起狀態。當等待的消息到、等待超時或延遲到時,任務狀態就由掛起狀態進入就緒狀態,任務如果是任務就緒表中優先級最高的任務,通過調度和任務切換,進入運行狀態。 任務處于運行狀態時,如中斷發生,通過中斷響應處理使任務就緒,并進行中斷級調度:如果是任務就緒表中優先級最高的任務,繼續運行;如不是,進行任務切換,任務由運行狀態轉變為就緒狀態。 處于就緒狀態時的任務,也可以由于當前運行任務的請求從就緒狀態轉變為掛起狀態。 2.5 順序圖 占先式實時內核強調的是時間和事件。在UML中,順序圖是具有這種特性的動態交互模型。占先式實時內核的順序力圖4所示。 圖4展示了中斷和任務、任務和任務之間的交互情況,這也是占先式實時內核的基本內容。參與流程的對象在框圖頂部的矩形中顯示,共有五個對象:中斷對象用來通知正在運行的任務有異步事件發生,并將正在運行任務的當前狀態保存,暫停任務的運行;中斷響應對象處理任務的中斷服務代碼,并將與中斷信號相應的任務置為就緒狀態,然后調度任務運行;低優先級任務和高優先級任務對象是用戶希望系統所能實現的功能,低優先級任務只有當所有高優先級任務運行完畢或處于懸掛狀態后才能運行;消息對象處理消息的發送與接收,消息接收表明有消息到來,然后消息發送使接收消息的任務狀態轉為就緒狀態,進而進行任務級的調度,使高優先級的任務得以運行。 圖4 占先式實時內核順序圖 3 占先式實時內核代碼實現 在設計建模完成后,系統中對象的行為和它們之間的邏輯關系都已經清楚和確定下來,類和類的關系也得到進一步的抽象,這時需要選擇具體的開發工具來實現占先式實時內核。在設計建模完成后,系統中對象的行為和它們之間的邏輯關系都已經清楚和確定下來,類和類的關系也得到進一步的抽象,這時需要選擇具體的開發工具來實現占先式實時內核。我使用Cygnal IDE(集成開發環境)作為系統的軟件開發平臺。IDE支持C語言和匯編語言的源程序級調試,具有豐富的開發與測試工具。本系統采用C語言作為開發工具,具體設計不再詳述。 結語 占先式實時內核在嵌入式系統開發應用中一直被認為是個難點,這主要是由于其內在關系比較復雜和繁瑣,采用以往的方法往往會陷入反復設計和調試的過程中,最后實現的程序也會由于種種原因存在不易覺察的隱患,這樣就會限制軟件的推廣和應用。 通過對占先式實時內核采用UML語言建模,可以比較清晰地認識到占先式實時內核在工作機制和具體實現過程各個階段的工作內容,能夠有效降低開發占先式實時內核所冒的風險,提高占先式實時內核編碼和測試的效率與穩定性,縮短開發周期,這在嵌入式技術中有較好的實際意義。 參考文獻 1. Joseph Schmuller.李虎 UML基礎、案例與應用 2002 2. MARK PRIESTLEY 面向對象設計的UML實踐 2000 3. Labrosse Jean J.邵貝貝 μ C/OS-II:源碼公開的實時嵌入式操作系統 2001 4. Micbeal Barr.于志宏 C/C++嵌入式系統編程 2001 作 者:鄭州輕工業學院 鄭竑宇 宋寅卯 來 源:單片機與嵌入式系統應用2003(9) |