| VxWorks操作系統(tǒng)及實(shí)時(shí)多任務(wù)程序設(shè)計(jì)* 中國(guó)科技大學(xué)劉尉悅張萬(wàn)生邢濤王硯方 摘要數(shù)字式聲納系統(tǒng)需要實(shí)時(shí)顯示其搜索、跟蹤結(jié)果,同時(shí)對(duì)用戶命令作出及時(shí)的響應(yīng),并實(shí)時(shí)控制前端的硬件。本文基于VxWorks實(shí)時(shí)操作系統(tǒng)和X窗口系統(tǒng)的顯示及控制程序設(shè)計(jì),著重介紹實(shí)時(shí)多任務(wù)程序設(shè)計(jì)。 關(guān)鍵詞實(shí)時(shí)實(shí)時(shí)操作系統(tǒng)VxWorksX\ Window 系統(tǒng)概況 本系統(tǒng)運(yùn)行于VME總線系統(tǒng)(MVME177)上,通過(guò)VME背板總線與各模件交換數(shù)據(jù)對(duì)各處理模件進(jìn)行控制并顯示信號(hào)處理結(jié)果。MVME177模件運(yùn)行于嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks下,人機(jī)交互界面基于X窗口系統(tǒng)。 一、 嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks簡(jiǎn)介 由于聲納系統(tǒng)在探測(cè)到某些目標(biāo)(如魚雷)后要迅速作出反應(yīng),所以要求控制及顯示系統(tǒng)必須是實(shí)時(shí)操作系統(tǒng)。實(shí)時(shí)操作系統(tǒng)要求能夠隨時(shí)打斷正在執(zhí)行的任務(wù),對(duì)內(nèi)部和外部發(fā)生的事件在確定的時(shí)間內(nèi)作出響應(yīng)。本系統(tǒng)采用的VxWorks 是由美國(guó)WindRiver開(kāi)發(fā)的一種類UNIX的高性能嵌入式實(shí)時(shí)操作系統(tǒng)。它是目前世界上用戶數(shù)量最大的實(shí)時(shí)操作系統(tǒng),具有優(yōu)越的技術(shù)性能、豐富的應(yīng)用軟件支持、良好的技術(shù)服務(wù)和可靠的系統(tǒng)穩(wěn)定性。 VxWorks的主要性能特點(diǎn)有: (1) 高度可剪裁的微內(nèi)核結(jié)構(gòu)。VxWorks所需要的存儲(chǔ)器空間大約為8KB~488KB(ROM)、620KB~29.3KB(RAM),具有極好的可伸縮性。 (2) 高效的多任務(wù)調(diào)度。VxWorks 支持中斷驅(qū)動(dòng)的優(yōu)先級(jí)搶占式調(diào)度和時(shí)間片輪轉(zhuǎn)調(diào)度,并具有確定的、快速的上下文切換能力。 (3) 靈活的任務(wù)間通信手段。支持信號(hào)燈、消息隊(duì)列、管道、信號(hào)和套接字等進(jìn)程間通信和互斥手段。 (4) 支持諸如Ring buffer、Link list 等共享內(nèi)存技術(shù)。 (5) 確定的μs級(jí)的中斷延遲時(shí)間。 (6) 適用于多種物理介質(zhì)的TCP/IP協(xié)議族支持和幾乎所有常用的基于TCP/IP協(xié)議的應(yīng)用層協(xié)議。 (7) 極其豐富的板級(jí)支持軟件包(BSP),支持多種處理器板。 (8) 支持POSIX 1003.1b (實(shí)時(shí)擴(kuò)充)。 (9) 快速、靈活的I/O系統(tǒng)。 (10) 支持MS\ DOS、RT\ 11和RAW等文件系統(tǒng)和網(wǎng)絡(luò)文件系統(tǒng)(NFS)。 (11) 靈活的啟動(dòng)方法。支持從ROM、本地磁盤以及網(wǎng)絡(luò)啟動(dòng)。 二、 VxWorks的一些技術(shù)特點(diǎn) VxWorks的特點(diǎn)主要在于嵌入式和實(shí)時(shí)性。由于嵌入式的特點(diǎn),系統(tǒng)內(nèi)核只有任務(wù)管理和簡(jiǎn)單的內(nèi)存管理,在此之上可以根據(jù)需要配置各種功能模塊,包括網(wǎng)絡(luò)管理、文件系統(tǒng)、虛擬存儲(chǔ)器等等。實(shí)時(shí)性則體現(xiàn)在實(shí)時(shí)調(diào)度算法和實(shí)時(shí)內(nèi)核(高效的進(jìn)程間通信、內(nèi)存管理等)。 VxWorks支持POSIX標(biāo)準(zhǔn),所以POSIX的概念和接口以及一些策略都被支持。但為了提高系統(tǒng)性能,VxWorks另有一套接口及實(shí)現(xiàn)策略稱為wind內(nèi)核。下面的討論主要針對(duì)wind內(nèi)核。POSIX標(biāo)準(zhǔn)可以參見(jiàn)相關(guān)資料。 (1) 任務(wù) 在VxWorks中,最小的程序運(yùn)行單位稱為任務(wù)(task)。每個(gè)任務(wù)包含一段固定的代碼和數(shù)據(jù)空間。操作系統(tǒng)內(nèi)核通過(guò)任務(wù)控制塊(task control block)對(duì)它的執(zhí)行、通信、資源等情況進(jìn)行控制。任務(wù)具有就緒、阻塞、掛起和延遲等狀態(tài)。 與Linux和WindowsNT下的進(jìn)程不同的是:在VxWorks中,所有任務(wù)共同享有物理內(nèi)存,存在于統(tǒng)一的線性空間中。每個(gè)任務(wù)沒(méi)有自己獨(dú)立的代碼段和堆,只有獨(dú)立的動(dòng)態(tài)棧。任務(wù)中的地址即是真正的物理地址。由于不需要進(jìn)行地址空間映射,在任務(wù)切換時(shí)的上下文切換(context switch)時(shí)間大為減少,符合實(shí)時(shí)操作系統(tǒng)要求快速響應(yīng)的原則。從這個(gè)意義上來(lái)說(shuō),VxWorks的任務(wù)更接近Linux和WindowsNT下的線程(thread)。 VxWorks的代碼段與堆共享減少了上下文切換時(shí)間,卻帶來(lái)了共享代碼的可重入性(reentrancy)問(wèn)題。如1個(gè)函數(shù)被2個(gè)任務(wù)所調(diào)用,當(dāng)其中包含對(duì)全局、靜態(tài)變量等從堆中分配空間的數(shù)據(jù)進(jìn)行訪問(wèn)時(shí),就有可能產(chǎn)生沖突,從而引發(fā)錯(cuò)誤。在應(yīng)用軟件開(kāi)發(fā)時(shí)要加以注意。解決方法是使用局部變量(從棧中分配空間)或使用信號(hào)燈對(duì)臨界代碼進(jìn)行監(jiān)控。 (2) 任務(wù)調(diào)度 VxWorks有2種任務(wù)調(diào)度策略:優(yōu)先級(jí)搶先調(diào)度和時(shí)間片輪轉(zhuǎn)調(diào)度。這2種調(diào)度策略都是系統(tǒng)級(jí)的,與POSIX進(jìn)程級(jí)的調(diào)度策略不同,即整個(gè)系統(tǒng)里要么是優(yōu)先級(jí)搶先調(diào)度,要么是時(shí)間片輪轉(zhuǎn)調(diào)度;而POSIX標(biāo)準(zhǔn)下可以每個(gè)進(jìn)程使用自己的調(diào)度策略。系統(tǒng)共有256個(gè)優(yōu)先級(jí)。 優(yōu)先級(jí)搶先調(diào)度指的是一個(gè)優(yōu)先級(jí)較低的任務(wù)正在執(zhí)行中,另一個(gè)優(yōu)先級(jí)高的任務(wù)進(jìn)入就緒狀態(tài),則馬上進(jìn)行處理器搶先,執(zhí)行高優(yōu)先級(jí)任務(wù),直到高優(yōu)先級(jí)釋放處理器(完成、掛起、阻塞等)才繼續(xù)執(zhí)行低優(yōu)先級(jí)任務(wù)。 優(yōu)先級(jí)搶先調(diào)度可以保證實(shí)時(shí)系統(tǒng)的迅速響應(yīng)特性,但是也帶來(lái)1個(gè)問(wèn)題:當(dāng)系統(tǒng)中存在幾個(gè)相同優(yōu)先級(jí)的任務(wù)時(shí),就會(huì)使單一任務(wù)獨(dú)占處理器,直至完成。為此加入了基于優(yōu)先級(jí)的時(shí)間片輪轉(zhuǎn)調(diào)度方式。在不同優(yōu)先級(jí)的任務(wù)間以搶先方式調(diào)度,相同優(yōu)先級(jí)的任務(wù)則以時(shí)間片進(jìn)行輪轉(zhuǎn)。 (3) 存儲(chǔ)管理 在基本的wind內(nèi)核中,任務(wù)直接操作線性物理內(nèi)存,不存在虛擬存儲(chǔ)等復(fù)雜的存儲(chǔ)管理策略,這主要是從性能來(lái)考慮的。不過(guò)VxWorks也提供支持POSIX標(biāo)準(zhǔn)的虛擬存儲(chǔ)區(qū)和共享內(nèi)存(多處理器間共享)組件。 (4) 任務(wù)間通信 在任務(wù)間傳遞控制信息時(shí),通信量小,wind內(nèi)核支持各種UNIX的通信手段:信號(hào)量(semaphore)、消息隊(duì)列(message queue)、管道(pipe)、信號(hào)(signal)、套接字(socket)。信號(hào)量主要用于對(duì)臨界資源訪問(wèn)的同步和互斥;消息隊(duì)列多用于消息驅(qū)動(dòng)機(jī)制;管道是基于文件系統(tǒng)實(shí)現(xiàn)的任務(wù)間按先進(jìn)先出方式傳送數(shù)據(jù)的通信方式;信號(hào)相當(dāng)于軟中斷;套接字機(jī)制主要用于網(wǎng)絡(luò)通信。 當(dāng)任務(wù)間需要大量交換數(shù)據(jù)時(shí),由于VxWorks直接操作物理內(nèi)存,可以直接訪問(wèn)全局存儲(chǔ)區(qū),不需要特別的手段,與Linux下的共享存儲(chǔ)段申請(qǐng)和WindowsNT中的存儲(chǔ)映射文件方式不同。 (5) 中斷 在VxWorks下,所有中斷服務(wù)程序都不屬于任何一個(gè)任務(wù),并且使用同一個(gè)棧進(jìn)行數(shù)據(jù)存儲(chǔ),則中斷將不會(huì)引起上下文切換,以實(shí)現(xiàn)高效的中斷響應(yīng)。中斷與各任務(wù)之間可以通過(guò)前面所述的各種手段進(jìn)行通信,但要注意對(duì)中斷服務(wù)程序有一些限制,例如不能進(jìn)行可能導(dǎo)致阻塞的資源申請(qǐng)等等。 (6) 文件系統(tǒng) VxWorks支持多種本地文件系統(tǒng):MS_DosFS、RawFS和RT\ 11FS,可根據(jù)具體配置選擇;還支持網(wǎng)絡(luò)文件系統(tǒng)NFS,可以沒(méi)有局域文件系統(tǒng)。 (7) 網(wǎng)絡(luò)支持 Vxworks支持多種物理介質(zhì)的TCP/IP協(xié)議族和幾乎所有常用的基于TCP/IP協(xié)議的應(yīng)用層協(xié)議,例如ARP、BOOTP、SLIP和FTP,甚至其啟動(dòng)就是通過(guò)BOOTP或FTP方式取得系統(tǒng)映像文件的。 以上簡(jiǎn)單介紹了一些VxWorks的技術(shù)特點(diǎn)。要注意,這些特點(diǎn)都是跟VxWorks的特性——實(shí)時(shí)性與嵌入式密切相關(guān)的。 三、 X窗口系統(tǒng) 本系統(tǒng)采用美國(guó)Peritek公司的VCL\ V圖形控制器插件進(jìn)行顯示輸出和輸入控制,客戶界面基于X\ Window。X客戶程序的開(kāi)發(fā)選用美國(guó)SeaWeed公司的SeaWindM軟件。 X是美國(guó)麻省理工學(xué)院(MIT)研制的一個(gè)可移植的網(wǎng)絡(luò)透明的窗口系統(tǒng)。它具有設(shè)備獨(dú)立性和網(wǎng)絡(luò)透明性的特點(diǎn),即基于X開(kāi)發(fā)的應(yīng)用程序不需要重寫或重新編譯就可以在新的顯示硬件上執(zhí)行,并且在網(wǎng)絡(luò)環(huán)境下通過(guò)X可在網(wǎng)絡(luò)任一節(jié)點(diǎn)上運(yùn)行X的應(yīng)用程序而不必考慮該節(jié)點(diǎn)的物理位置。 四、 顯示與控制系統(tǒng)的具體實(shí)現(xiàn) 本系統(tǒng)的功能主要是初始化各處理模件、根據(jù)輸入命令對(duì)各處理模件進(jìn)行控制和對(duì)處理結(jié)果的實(shí)時(shí)顯示。這些都是通過(guò)與相應(yīng)子系統(tǒng)的數(shù)據(jù)通信來(lái)完成的。對(duì)通信數(shù)據(jù)和策略的分析是系統(tǒng)設(shè)計(jì)的關(guān)鍵。系統(tǒng)與其他子系統(tǒng)中存在著這樣幾類通信數(shù)據(jù):與前端模擬子系統(tǒng)的控制信息與數(shù)據(jù)、與數(shù)字信號(hào)處理子系統(tǒng)相關(guān)的控制信息和數(shù)據(jù)、發(fā)射信號(hào)控制信息、顯示數(shù)據(jù)以及從鍵盤和鼠標(biāo)獲得的輸入信息。這幾類數(shù)據(jù)都是通過(guò)VME背板總線傳輸,通過(guò)對(duì)VME地址空間直接讀寫進(jìn)行訪問(wèn)。其中由數(shù)字信號(hào)處理子系統(tǒng)送來(lái)的數(shù)據(jù)是由數(shù)據(jù)更新事件驅(qū)動(dòng)的。為了滿足實(shí)時(shí)性的要求,需要在每組結(jié)果數(shù)據(jù)更新之前完成通信,因此處理的優(yōu)先級(jí)需要很高。 圖1各任務(wù)流程框圖基于上面的考慮,系統(tǒng)劃分為4個(gè)任務(wù):系統(tǒng)監(jiān)控、顯示與輸入、子模件控制和錯(cuò)誤處理。 這些任務(wù)都設(shè)計(jì)為事件驅(qū)動(dòng)流程,如圖1所示。 系統(tǒng)監(jiān)控——提交和監(jiān)控其他子任務(wù)。 顯示與輸入——實(shí)時(shí)顯示信號(hào)處理結(jié)果和產(chǎn)生輸入消息。 子模件控制——向各子模件發(fā)送控制參數(shù)和計(jì)算數(shù)據(jù),由輸入消息驅(qū)動(dòng)。 錯(cuò)誤處理——根據(jù)錯(cuò)誤類型進(jìn)行相應(yīng)處理:顯示錯(cuò)誤信息、重啟動(dòng)各模件、中止系統(tǒng),由出錯(cuò)消息驅(qū)動(dòng)。 信號(hào)處理結(jié)果讀取在顯示和輸入任務(wù)中完成,其驅(qū)動(dòng)事件為處理結(jié)果更新。在被動(dòng)聲納處理中,短時(shí)間能量積累的結(jié)果每64ms更新一次,平均功率譜結(jié)果每1.5s更新一次;主動(dòng)聲納處理的幅度信息數(shù)據(jù)率為1.3kb/s,頻域處理結(jié)果更新率為5~10次/s。如果由信號(hào)處理模件在數(shù)據(jù)更新后向MVME177發(fā)送中斷事件,由于數(shù)據(jù)更新率差別較大,可能造成瞬間中斷頻繁,增加處理復(fù)雜度。所以采用定時(shí)中斷,使用間隔為50ms的定時(shí)中斷去檢查數(shù)據(jù)更新標(biāo)志,既能保證實(shí)時(shí)數(shù)據(jù)刷新,又能簡(jiǎn)化處理結(jié)構(gòu)。 各任務(wù)間的大批量數(shù)據(jù)傳輸利用VxWorks的共享內(nèi)存直接訪問(wèn),而傳遞控制消息多采用消息隊(duì)列(message queue)。在顯示和輸入任務(wù)中有兩類驅(qū)動(dòng)事件:鍵盤、鼠標(biāo)輸入和顯示數(shù)據(jù)更新。顯示刷新的優(yōu)先級(jí)應(yīng)該高于人工輸入,所以在這里使用了信號(hào)(signal)。當(dāng)任務(wù)捕獲信號(hào)時(shí),立即中斷正在執(zhí)行的流程,轉(zhuǎn)而進(jìn)行信號(hào)服務(wù)處理。完成后,繼續(xù)原處理流程可以保證顯示的實(shí)時(shí)刷新。 各任務(wù)之間的通信機(jī)制由4個(gè)消息隊(duì)列、1個(gè)定時(shí)中斷和1個(gè)信號(hào)完成: 消息隊(duì)列SystemMsg:系統(tǒng)開(kāi)機(jī)、系統(tǒng)關(guān)機(jī)、系統(tǒng)復(fù)位、系統(tǒng)重啟等,由錯(cuò)誤處理任務(wù)和鍵盤輸入產(chǎn)生;由系統(tǒng)監(jiān)控任務(wù)接收。 消息隊(duì)列ParamModifyMsg:更改前端硬件參數(shù)、DSP參數(shù)等,由鍵盤輸入產(chǎn)生,由子模件控制任務(wù)接收。 消息隊(duì)列ErrorMsg:定義了各種錯(cuò)誤類型,由各任務(wù)的出錯(cuò)接口產(chǎn)生;由錯(cuò)誤處理任務(wù)接收。 X消息隊(duì)列:由顯示和輸入任務(wù)接收(被SeaWindM軟件包封裝)。 定時(shí)中斷:由系統(tǒng)監(jiān)控任務(wù)啟動(dòng)和停止,讀取DSP處理結(jié)果。 信號(hào)處理:由顯 示和輸入任務(wù)注冊(cè),定時(shí)中斷發(fā)送信號(hào),接收到后進(jìn)行數(shù)據(jù)顯示。 系統(tǒng)定義全局變量System_Data。其數(shù)據(jù)類型為自定義的System_Data_Struct結(jié)構(gòu)。通過(guò)System_Data實(shí)現(xiàn)任務(wù)間的數(shù)據(jù)交換。各任務(wù)優(yōu)先級(jí)和消息傳遞如圖2所示。 結(jié)束語(yǔ) 以上介紹了數(shù)字式聲納的顯控系統(tǒng)的設(shè)計(jì);赩xWorks的多任務(wù)設(shè)計(jì)使系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性都非常好。目前該顯控系統(tǒng)已通過(guò)測(cè)試,達(dá)到了系統(tǒng)的設(shè)計(jì)要求。MES 圖2各任務(wù)優(yōu)先級(jí)和消息傳遞示意圖 |