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