VxWork介紹及程式設計
一.嵌入式作業系統VxWorks簡介
VxWorks作業系統是美國WindRiver公司於1983年設計開發的一種嵌入式實時作業系統(RTOS),是嵌入式開發環境的關鍵組成部分。良好的持續發展能力、高效能的核心以及友好的使用者開發環境,在嵌入式實時作業系統領域佔據一席之地。它以其良好的可靠性和卓越的實時性被廣泛地應用在通訊、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛星通訊、軍事演習、彈道制導、飛機導航等。在美國的 F-16、FA-18 戰鬥機、B-2 隱形轟炸機和愛國者導彈上,甚至連1997年4月在火星表面登陸的火星探測器上也使用到了VxWorks。
實時作業系統和分時作業系統的區別
從作業系統能否滿足實時性要求來區分,可把作業系統分成分時作業系統和實時作業系統。
分時作業系統按照相等的時間片排程程序輪流執行,分時作業系統由排程程式自動計算程序的優先順序,而不是由使用者控制程序的優先順序。這樣的系統無法實時響應外部非同步事件。
實時作業系統能夠在限定的時間內執行完所規定的功能,並能在限定的時間內對外部的非同步事件作出響應。 分時系統主要應用於科學計算和一般實時性要求不高的場合。實時性系統主要應用於過程控制、資料採集、通訊、多媒體資訊處理等對時間敏感的場合。
VxWorks的特點
- 可靠性
作業系統的使用者希望在一個工作穩定,可以信賴的環境中工作,所以作業系統的可靠性是使用者首先要考慮的問題。而穩定、可靠一直是VxWorks的一個突出優點。自從對中國的銷售解禁以來,
VxWorks以其良好的可靠性在中國贏得了越來越多的使用者。
- 實時性
實時性是指能夠在限定時間內執行完規定的功能並對外部的非同步事件作出響應的能力。實時性的強弱是以完成規定功能和作出響應時間的長短來衡量的。
VxWorks 的實時性做得非常好,其系統本身的開銷很小,程序排程、程序間通訊、中斷處理等系統公用程式精練而有效,它們造成的延遲很短。VxWorks 提供的多工機制中對任務的控制採用了優先順序搶佔(Preemptive Priority Scheduling)和輪轉排程(Round-Robin Scheduling)機制,也充分保證了可靠的實時性,使同樣的硬體配置能滿足更強的實時性要求,為應用的開發留下更大的餘地。
- 可裁減性
使用者在使用作業系統時,並不是作業系統中的每一個部件都要用到。例如圖形顯示、檔案系統以及一些裝置驅動在某些嵌入系統中往往並不使用。
VxWorks 由一個體積很小的核心及一些可以根據需要進行定製的系統模組組成。VxWorks 核心最小為 8kB,即便加上其它必要模組,所佔用的空間也很小,且不失其實時、多工的系統特徵。由於它的高度靈活性,使用者可以很容易地對這一作業系統進行定製或作適當開發,來滿足自己的實際應用需要。
對一個實時核心的要求
一個實時作業系統核心需滿足許多特定的實時環境所提出的基本要求,這些包括:
多工:由於真實世界的事件的非同步性,能夠執行許多併發程序或任務是很重要的。多工提供了一個較好的對真實世界的匹配,因為它允許對應於許多外部事件的多執行緒執行。系統核心分配CPU給這些任務來獲得併發性。
搶佔排程:真實世界的事件具有繼承的優先順序,在分配CPU的時候要注意到這些優先順序。基於優先順序的搶佔排程,任務都被指定了優先順序,在能夠執行的任務(沒有被掛起或正在等待資源)中,優先順序最高的任務被分配CPU資源。換句話說,當一個高優先順序的任務變為可執行態,它會立即搶佔當前正在執行的較低優先順序的任務。
任務間的通訊與同步:在一個實時系統中,可能有許多工作為一個應用的一部分執行。系統必須提供這些任務間的快速且功能強大的通訊機制。核心也要提供為了有效地共享不可搶佔的資源或臨界區所需的同步機制。
任務與中斷之間的通訊:儘管真實世界的事件通常作為中斷方式到來,但為了提供有效的排隊、優先化和減少中斷延時,我們通常希望在任務級處理相應的工作。所以需要雜任務級和中斷級之間存在通訊。
二.系統程式設計方法
實時系統主要包括:多工排程(採用優先順序搶佔方式),任務間的同步和程序間通訊機制.
一個多工環境允許實時應用程式以一套獨立任務的方式構築,每個任務擁有獨立的執行執行緒和它自己的一套系統資源。程序間通訊機制使得這些任務的行為同步、協調。 wind使用中斷驅動和優先順序的方式。它縮短了上下文轉換的時間開銷和中斷的時延。在 VxWorks 中,任何例程都可以被啟動為一個單獨的任務,擁有它自己的上下文和堆疊。還有一些其它的任務機制可以使任務掛起、繼續、刪除、延時或改變優先順序。
另一個重要內容是:硬體中斷處理。硬體產生中斷,統治系統呼叫相應的中斷歷程(ISR),位是系統得到儘快的響應,ISR在它自己獨立的上下文和堆疊中執行.它的優先順序高於任何任務優先順序.
中斷延遲(Interrupt Latency) 中斷延遲是指從硬體中斷髮生到開始執行中斷處理程式第一條指令之間的這段時間。
優先順序驅動(Priority-Driven) 優先順序驅動是指多工系統中,當前執行任務總是具有最高優先順序的就緒任務。
- 多工排程
兩種方式: 優先搶佔和輪轉排程(Preemptive Priority,Round-Robin Scheduling).
優先搶佔(Preemptive Priority): 每一個任務都有一個優先順序,系統核心保證優先順序最高的任務運行於CPU.如果有任務優先順序高於當前的任務優先順序,系統立刻儲存當前任務的上下文,切換到優先順序高的上下文.
搶佔(Preemptive): 搶佔是指當系統處於核心態執行時, 允許任務的重新排程。換句話說就是指正在執行的任務可以被打斷,讓另一個任務執行。搶佔提高了應用對非同步事件的響應效能力。作業系統核心可搶佔,並不是說任務排程在任何時候都可以發生。例如當一個任務正在通過一個系統呼叫訪問共享資料時,重新排程和中斷都被禁止.
任務上下文(Task Context):任務上下文是指任務執行的環境。例如,針對x86的CPU,任務上下文可包括程式計數器、堆疊指標、通用暫存器的內容.
上下文切換(Context Switching): 多工系統中,上下文切換是指CPU的控制權由執行任務轉移到另外一個就緒任務時所發生的事件,當前執行任務轉為就緒(或者掛起、刪除)狀態,另一個被選定的就緒任務成為當前任務。上下文切換包括儲存當前任務的執行環境,恢復將要執行任務的執行環境。上下文的內容依賴於具體的CPU.
輪轉排程(Round-Robin Scheduling):使所有相同優先順序,狀態為ready的任務公平分享CPU(分配一定的時間間隔,使個任務輪流享有CPU).
系統由256個優先順序,從0到255,0為最高,255為最低. 任務在被建立時設定了優先順序.也可用taskPrioritySet ( ) 來改變任務優先順序.
任務的主要狀態: READY,PEND,DELAY,SUSPEND...
輪轉排程 (Round-Robin): 輪轉排程可以擴充到優先搶佔方式中,當多個任務優先順序相同的情況下,輪轉排程演算法使任務按平等的時間片運行於CPU,共享CPU.避免一個任務長時間佔用CPU,而導致其他任務不能執行.可以用 kernelTimeSlice( ) 來定義時間長度.
taskLock ( )和 taskUnlock ( ) 用來取消優先搶佔方式 和恢復優先搶佔方式.
注意: 一個任務可以呼叫taskDelete ( ) 刪除另一個任務,但是如果一個當前正在執行的任務被刪除後,該任務的記憶體沒有釋放,而其他任務不知道,依然在等待,結果導致系統stop.用 taskSafe ( ) 和 taskUnsafe ( ) 來保證正在執行的任務不被刪除.
用法如下:
taskSafe ();
semTake (semId, WAIT_FOREVER);
/* Block until semaphore available */
. .. .critical region .
semGive (semId);semGive (semId);/* Release semaphore */
taskUnsafe ();
- 任務間的同步和程序間協調
訊號量作為任務間同步和互斥的機制。在 wind 核中有幾種型別的訊號量,它們分別針對不同的應用需求:二進位制訊號量、計數訊號量、互斥訊號量和 POSIX 訊號量。所有的這些訊號量是快速和高效的,它們除了被應用在開發設計過程中外,還被廣泛地應用在VxWorks 高層應用系統中。對於程序間通訊,wind 核也提供了諸如訊息佇列、管道、套接字和訊號等機制。
任務間的同步和程序間協調的幾種方式:
- 記憶體共享(Shared Memory),對簡單的資料共享而言.
- 訊號量(Semaphore),基本的互斥和同步.
- 訊息佇列(Message queues)和管道(Pipe),單個CPU中,任務間的資訊傳遞.
- 套結字(Socket)和遠端呼叫(Remote procedure calls),相對於網路任務間的通訊.
- 訊號(Signals),出錯處理(Exception handling).
互斥(Mutual Exclusion)
互斥是用來控制多工對共享資料進行序列訪問的同步機制。在多工應用中,當兩個或多個任務同時訪問共享資料時,可能會造成資料破壞。互斥使它們序列地訪問資料,從而達到保護資料的目的.
解決互斥的幾種方法:
1. 關閉中斷的方法(intLock): 能解決任務和中斷ISR之間產生的互斥.
但在實時系統中採取這個辦法會影響系統對外部中斷及時響應和處理的能力.
2. 關閉系統優先順序(taskLock): 關閉系統優先順序,這樣在當前任務執行時,除了中斷外,不會有其他優先順序高的任務來搶佔CPU,影響當前程式執行.
這種方法阻止了高優先順序的任務搶先執行,在實時系統中也是不適合的,除非關閉優先順序的時間特別短.
3. 訊號量(Semaphore): 訊號量是解決互斥和同步協調程序最好的方法
- 當一個Semaphore建立時,指定了任務佇列的種類
- semBCreat( SEM_Q_PRIORITY, SEM_FULL), SEM_Q_PRIORITY 指明處於等待狀態的任務在等待佇列中以優先順序的順序排列
- semBCreat(SEM_Q_FIFO,SEM_FULL), SEM_Q_FIFO指明 處於等待狀態的任務在等待佇列中以先進先出的順序排列
- 當一個Semaphore建立時,指定了這個semaphore是用在解決互斥還是用來同步任務
- semBCreat( SEM_Q_FIFO, SEM_FULL) , SEM_FULL 指明用於任務間互斥.
- semBCreat(SEM_Q_FIFO,SEM_EMPTY), SEM_EMPTY 指明用於任務間同步.
函式介紹:
semTake(semID,time out)--------有Semaphore空閒,就Take, 如果沒有,由time out 定,超時則向下執行
優先順序反轉(Priority Inversion)
優先順序反轉是指一個任務等待比它優先順序低的任務釋放資源而被阻塞,如果這時有中等優先順序的就緒任務,阻塞會進一步惡化。優先順序繼承技術可用來解決優先順序反轉問題。
Priority inversion arises when a higher-priority task is forced to wait an indefinite period of time for a lower-priority task to complete.
優先順序繼承(Priority Inheritance)
優先順序繼承可用來解決優先順序反轉問題。當優先順序反轉發生時,優先順序較低的任務被暫時地提高它的優先順序,使得該任務能儘快執行,釋放出優先順序較高的任務所需要的資源。
The mutual-exclusion semaphore has the option SEM_INVERSION_SAFE, which enables a priority-inheritance algorithm. The priority-inheritance protocol assures that a task that owns a resource executes at the priority of the highest-priority task blocked on that resource. Once the task priority has been elevated, it remains at the higher level until all mutual-exclusion semaphores that the task owns are released; then the task returns to its normal, or standard, priority. Hence, the "inheriting" task is protected from preemption by any intermediate-priority tasks. This option must be used in conjunction with a priority queue (SEM_Q_PRIORITY).