歡迎您光臨本站 登入註冊首頁

概述

   近些年來,隨著嵌入式系統飛速的發展,嵌入式實時操作系統廣泛地應用在製造工業、過程式控制制、通訊、儀器儀錶、汽車、船舶、航空航天、軍事、裝備、消費類產品等方面。今天嵌……

    近些年來,隨著嵌入式系統飛速的發展,嵌入式實時操作系統廣泛地應用在製造工業、過程式控制制、通訊、儀器儀錶、汽車、船舶、航空航天、軍事、裝備、消費類產品等方面。今天嵌入式系統帶來的工業年產值超過了1萬億美元。當前嵌入式操作系統有數百種,比較流行的有Nucleus Plus,QNX,Lynx OS,Psos,VRTX,VXWorks,Windows CE等。它們各有特色,用戶可以根據自身的軟硬體環境的要求,選擇合適的操作系統。既然Nucleus已經成為嵌入式應用的潮流和方向,剖析Nucleus 中線程式控制制的實現方法就具有重要的意義。

1 Nucleus內核
    Nucleus Plus是一個為實時嵌入式應用而設計的搶佔式多任務的操作系統內核。Nucleus Plus大約有95%的代碼是用ANSI C編寫的。正因如此,Nucleus Plus特別便於移植,並且在大多數的多處理器系統中都可使用。從實現角度來看,Nucleus Plus是一組C,將應用程序與核心函數庫連接在一起,生成一個目標代碼,下載到目標板的RAM中或直接燒錄到目標板的ROM中執行。如果所有的服務都需要,在典型的目標環境中,Nucleus Plus的核心代碼大約有20KB。
    Nucleus Plus採用了軟體組件(Component)的方法。每個組件具有單一明確的目的,通常由幾個C或彙編模塊構成,提供清晰的外部介面,對組件的引用就是通過這些介面完成的。除了少數一些特殊情況外,不允許從外部對組件內的變數進行訪問。由於採用了軟體組件的方法,Nucleus Plus各個組件非常易於替換和復用。Nucleus Plus的組件包括任務控制、中斷管理、定時器管理及I/O驅動管理等。
    Nucleus Plus支持大部分流行的CPU,如X86,68xxx,68HCxx,NEC V25,ColdFire,SPARClite,PowerPC等。針對不同的CPU類型,Nucleus還提供編譯器、動態連接器、多任務調試器等相應的工具來配置用戶的開發環境,方便軟體的開發和調試。
    Nucleus Plus內核(Kerne1)的主要目的是管理實時任務的競爭運行(共享CPU),為應用提供各種便利,快速響應外部事件,實現實時性。Nucleus Plus的系統結構如圖1所示。
  
    從Nucleus的系統結構框圖可以看出線程式控制制是整個內核的核心,通過郵箱、隊列、管道來實現任務之間的通信,通過信號量、事件組和信號實現任務間的同步。Nucleus Plus 提供動態和分區內存(Dynamic/Partition Memory)兩種存儲器管理機制。Nucleus Plus還提供定時器(Timer)來處理周期性事件和任務的睡眠和掛起超時。Nucleus Plus 將這些機制稱之為軟體組件(Software Component)。Nucleus Plus為每一個軟體組件提供了一系列的系統調用,任務與Nucleus Plus的交互是在系統調用的界面上進行的。

2 線程式控制制
    線程式控制制部件用來管理實時任務和高級中斷服務的執行,它是Nucleus 嵌入式實時操作系統最核心的部分。為了控制執行過程,任務通常被分配一個優先順序。任務優先順序的範圍從0到255,優先順序0的優先權最高。除非搶佔位被置為無效,否則低優先順序的任務將被高優先順序就緒的任務搶佔。為保證任務執行的實時性,Nucleus設計了高級中斷服務,它的優先順序範圍從0到2,其中優先順序0的級別最高。
2.1 任務的狀態表示
    一個Nucleus任務是為完成特定目標而編寫的半獨立的程序段。許多應用有多個任務。任務狀態有五個:執行、就緒、掛起、終止、完成,如表1所示。

表1 Nucleus任務的五種狀態
狀態 意義
Executing  任務當前正在執行。
Ready 任務就緒,但是另一個任務當前正在運行。
Suspended 任務因為等待服務需求而體眠。當需求滿足時,任務變為就緒狀態。
Terminated 任務被終止。當任務處於這種狀態時,它將不再執行直到它被複位。
Finished  任務完成了它的處理.從進入函數中退出來。任務處於這種狀態時,它將不再執行直到受到複位。


2.2 任務調度演算法
    Nucleus調度程序用來決定是否要進行任務切換,如果需要切換的話,切換到哪個進程等。首先說明Nucleus的調度時機:
(1)進程狀態轉換的時刻,即進程終止、進程睡眠;
(2)可運行隊列中新增加一個進程時;
(3)當前進程的時間片用完;
(4)進程從系統調用返回到用戶態;
(5)內核處理完中斷後,進程返回到用戶態。
    Nucleus實時操作系統具有可搶佔性,進程調度的依據就是按照優先順序從高到低順序進行調度。當低優先順序任務在運行時,有高優先順序任務就緒準備執行,則將發生高優先順序任務搶佔低優先順序任務執行。
    Nucleus實時操作系統的任務調度演算法非常簡單,它包括時間片輪轉演算法和輪詢演算法。時間片輪轉演算法是將相同優先順序的任務都分配相同的時間片,當時間片用完后再轉到下一個任務,輪流執行直到這個優先順序的所有任務全部執行完畢,然後再轉到下一個優先順序。輪詢演算法是在本優先順序內的所有任務按照就緒時間的先後順序執行,當這個優先順序的全部任務都執行完畢后,再執行下一個優先順序的任務。
2.3 任務的優先順序
    任務的優先順序從0到255,0的優先順序別最高,255的優先順序別最低。256個優先順序分成32組,每組對應8個級別。例如第0組對應0~7,第一組對應8~15。由32位整型變數Tcd_priority_groups表示就緒任務屬於哪個優先順序組。用子優先順序數組Tcd_sub_priority_groups表示組內具體的優先順序。例如Tcd_sub_priority_groups[0]表示第0組的子優先順序,即它的第0位為1,表明優先順序為0的任務就緒;若它的第7位為1,表明優先順序為7的任務就緒。Nucleus中定義:
公式1 若任務的優先順序為Tc_priority,則該任務的子優先順序掩碼為:
tc_sub_priority=1<<(tc_priority&7)
公式2 若任務的優先順序為Tc_priority,則該任務的優先順序組掩碼為:
tc_priority_group=1<<((tc_priority)>>3)
TC_TCB *TCD_Priority_List是任務控制塊指針數組。數組中的每個元素都指向那個優先順序就緒任務列表頭。如果指針為空,那個優先順序沒有就緒任務。這個數組被優先順序索引。對於每個優先順序,其中的任務控制塊是以雙向列表的形式鏈接於這個變數的,如圖2所示。
 
    Nucleus在進行任務切換時需要計算最高優先順序。為此系統引入了一個大小為256的常數數組Unsigned char tcd_lowest_set_bit[n],其表示下標n的二進位數的不為0的最低位的位號。所以,系統中最高優先順序的組號=8×不為零的最低位元組的字型大小+Tcd_lowest_set_bit[不為零的最低位元組],系統中的最高優先順序=(系統中最高優先順序的組號<<3)+Tcd_lowest_set_bit[與這組號對應的子優先順序]。計算最高優先順序的程序如下:
if(tcd_priority_groups!=0)|if(tcd_priority_groups&0x000000f)
  index=0;/*第0位元組的基本組號*/
if(tcd_priority_groups&0x0000f00)
  index=8;/* 第1位元組的基本組號*/
if(tcd_priority_groups&0x00f0000)
  index=16;/*第2位元組的基本組號*/
else
  index=24;/* 第3位元組的基本組號*/
/*計算最高優先順序的組號*/
  index=index + tcd_lowest_set_bit[(int)((tcd_priority_group>>index)&0x000000ff)];
  temp = tcd_sub_priority_groups[index];
/*計算最高優先順序*/
  tcd_highest_priority=(index << 3) + tcd_lowest_set_bit[temp];
}
   此時,Tcd_priority_list[tcd_highest_priority]所指向的任務就是系統中最高優先順序任務。
2.4 中斷
   中斷是對外部和內部事件提供立即響應服務的機制,也是操作系統實時性的重要體現。Nucleus將中斷服務分為低級中斷服務(LISR)和高級中斷服務(HISR)。在LISR中執行少量的必要的工作,以便儘快地響應同級或低級的中斷。大部分工作在HISR中完成。HISR類似於任務,有自己的堆棧,但它的優先順序比一切任務的優先順序高(即系統總是首先調度HISR運行)。HISR的優先順序分為0到2,其中0的優先順序別最高,2的優先順序別最低。HISR的狀態只有兩種:激活狀態和靜止狀態。LISR按需要激活相應的HISR,然後HISR進入對應的HISR優先順序就緒隊列,等待CPU調度。相同優先順序的HISR鏈接成單鏈表,用數組*tc_hcb tcd_active_hisr_heads[tc_hisr_priorities]存放這些鏈表的頭地址。這樣在尋找最高優先順序的HISR時,只需簡單查找數組中第一個非零元素所指向的鏈表的第一個結點HISR。
    LISR在執行時需保存現場,以矢量號為變元調用Tcc_dispatch_lisr()執行對應的低層中斷常式,再跳轉到現場恢復常式。LISR無控制塊且沒有自己的堆棧,運行時佔用被中斷的任務、HISR的堆棧或系統堆棧。LISR可用彙編語言或c語言編程,若採用c語言則調用Tcc_register_lisr()安裝到某號中斷矢量上。
2.5 互斥保護量
    應用程序和操作系統的c語言常式用互斥保護量來保護臨界區。在Nucleus中保護量定義為一個結構:
typedef struct tc_protect_struct
{
tc_tcb tc_tcb_pointer; /*佔有這個保護量的線程*/
unsigned tc_thread_waiting; /*等待佔有保護量的線程*/
}tc_protect;
    應用程序和系統組件用常式Tct_protect()來請求保護量。該常式首先判斷保護量的Tc_tcb_pointer是否為空。如果為空,則表示該保護量可被線程佔有,把調用者的任務控制塊(Tcb)地址存入Tc_Tcb_pointer,同時將零送入Tc_thread_waiting以示無其它線程在等待佔有這個保護量。最後將保護量的地址存入調用者的Tc_current_protect中,表示該任務可佔用這個保護量。若tc_tcb_pointer非空,則表示該保護量已被佔有,將1存入Tc_thread_waiting中,以表示有線程在等待。為了防止優先順序逆轉,Nucleus調用常式Tct_schedule_protected()直接調度佔有該保護量的線程運行。
   當任務佔有臨界區完畢后,系統調用Tct_unprotect()歸還調用者的當前保護量。常式首先判斷保護量的Tc_thread_waiting是否為0。如果為0,則表明無任務在等待這個保護量,Nucleus將0存入Tc_tcb_pointer和Tc_current_protect。如果保護量不為0,則有較高的優先順序等待這個保護量。系統調用Tct_control_to_system()將控制權歸還給系統,選擇系統中最高優先順序的就緒任務運行,同時清變數Tc_tcb_pointer和Tc_current_protect。

3 結束語
    Nucleus是一種實時 多任務的嵌入式操作系統。它可以管理各種系統資源,調度任務的運行。Nucleus使嵌入式多任務開發省時、省力,並且提高效率。它已成為嵌入式應用的潮流和方向。本文深入剖析了Nucleus 的線程式控制制模塊的實現機理,對於嵌入式實時操作系統的開發具有重要的意義。


[admin via 研發互助社區 ] 嵌入式實時操作系統Nucleus中線程式控制制部件的實現方法已經有4269次圍觀

http://cocdig.com/docs/show-post-42171.html