vxworks---多任務(1)

1 多任務和上下文的概念

     系統經過啓動過程,硬件和上層軟件組件的初始化完成後,系統進入多任務運行環境。系統中最基本的執行線程單位爲任務和中斷。任務由操作系統內核調度執行。中斷由硬件異步觸發,進入中斷服務程序。系統存在多個任務,包括vxworks基本的系統任務和用戶自己定義的任務,所有任務統一地址空間,都運行在CPU

最高級別的系統模式(具有更好的系統性能)。

        在系統運行時,除了任務、中斷這樣的動態運行對象外,還存在一些靜態的對象,如:調度機制、任務間通信機制、內存管理機制和輸入輸出系統機制。靜態對象沒有自主的執行線程,總處於被動的被調用狀態。任務是一個動態的抽象的概念,可在運行時刪除和創建,是多任務環境中最基本的執行單元。每個創建的任務都對應一個內核分配的數據結構,即任務控制塊(TCB),用以保存關鍵的動態信息。每個任務都擁有自己的上下文,即擁有各自的CPU環境和系統資源,在上下文切換時,上下文保存在TCB中,TCB是vxworks中最重要的數據結構。任務上下文包括:

.任務的執行點,即任務的程序計數器(PC),程序計數器表示任務切換時正運行的代碼位置

.動態變量和函數調用所需的堆棧;

.IO操作分配的標準輸入、標準輸出和標準錯誤輸出操作;

.一個延時和時間片定時器;

.信號句柄,用於調試和性能監視的值。

上下文是系統運行的環境。當系統調度新的任務時,需要進行上下文切換,保存舊的上下文信息,恢復新的上下文。

2 消息隊列 

爲允許合作任務間的互相通信,需要一種更高級的機制來滿足要求,在vxworks操作系統中,單個CPU任務間的通信方式主要是使用消息隊列。

多個任務能夠向一個消息隊列發送和接受消息。兩個任務間的全雙工通信一般需要兩個消息隊列,每個方向一個消息隊列。如下表所示是消息隊列的建立 刪除 發送和接受的函數列表。

                           表 wind消息隊列控制函數

調用
描述
msgQcreate( ) 創建並初始化一個消息隊列
msgQdelete( ) 終止並釋放一個消息隊列
msgQsend( ) 向一個消息隊列發送一個消息
msgQreceive( ) 從一個消息隊列接受一個消息
msgQsend( ) 和 magQreceive( )可以設置超時時間參數,發送超時是指在沒有可用空間進行消息排隊時,從緩衝空間等到其可以使用時需要的tick長度。超時時間可以設置爲特殊值 NO_WAUTE,不等待立即返回,WAITE_FOREVER 一直等待。msgQsend()可以指定所發送消息的緊急情況爲優先級參數,MSG_PRI_NORMAL 爲正常,MSG_PRI_URGENT緊急。

舉個栗子程序:任務1創建消息隊列併發送消息,任務2接受消息隊列中的消息


#define   MAX_MSG_LEN  100  //每個消息的最大長度

#define MAX_MSG_NUM 10 //可以排隊的最大消息數目

 int myMsgQid; //消息ID號

task1(void)

{

#define message "1234567"

if( (myMsgQid = msgQcreate( MAX_MSG_NUM ,  MAX_MSG_LEN , WAIT_FOREVER) )== ERROR)

return error;

if(  msgQsend(myMsgQid, message ,  sizeof(message ), WAIT_FOREVER) == NULL)

return error;

}


task2 (void)

{

char msgBuff[  MAX_MSG_LEN];

if( msgQreceive( myMsgQid, msgBuff,  MAX_MSG_LEN ,WAIT_FOREVER  )  == ERROR )

return error;
}






發佈了28 篇原創文章 · 獲贊 19 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章