1 多任務和上下文的概念
系統經過啓動過程,硬件和上層軟件組件的初始化完成後,系統進入多任務運行環境。系統中最基本的執行線程單位爲任務和中斷。任務由操作系統內核調度執行。中斷由硬件異步觸發,進入中斷服務程序。系統存在多個任務,包括vxworks基本的系統任務和用戶自己定義的任務,所有任務統一地址空間,都運行在CPU
最高級別的系統模式(具有更好的系統性能)。
在系統運行時,除了任務、中斷這樣的動態運行對象外,還存在一些靜態的對象,如:調度機制、任務間通信機制、內存管理機制和輸入輸出系統機制。靜態對象沒有自主的執行線程,總處於被動的被調用狀態。任務是一個動態的抽象的概念,可在運行時刪除和創建,是多任務環境中最基本的執行單元。每個創建的任務都對應一個內核分配的數據結構,即任務控制塊(TCB),用以保存關鍵的動態信息。每個任務都擁有自己的上下文,即擁有各自的CPU環境和系統資源,在上下文切換時,上下文保存在TCB中,TCB是vxworks中最重要的數據結構。任務上下文包括:
.任務的執行點,即任務的程序計數器(PC),程序計數器表示任務切換時正運行的代碼位置。
.動態變量和函數調用所需的堆棧;
.IO操作分配的標準輸入、標準輸出和標準錯誤輸出操作;
.一個延時和時間片定時器;
.信號句柄,用於調試和性能監視的值。
上下文是系統運行的環境。當系統調度新的任務時,需要進行上下文切換,保存舊的上下文信息,恢復新的上下文。
2 消息隊列
爲允許合作任務間的互相通信,需要一種更高級的機制來滿足要求,在vxworks操作系統中,單個CPU任務間的通信方式主要是使用消息隊列。
多個任務能夠向一個消息隊列發送和接受消息。兩個任務間的全雙工通信一般需要兩個消息隊列,每個方向一個消息隊列。如下表所示是消息隊列的建立 刪除 發送和接受的函數列表。
表 wind消息隊列控制函數
調用 |
描述 |
msgQcreate( ) | 創建並初始化一個消息隊列 |
msgQdelete( ) | 終止並釋放一個消息隊列 |
msgQsend( ) | 向一個消息隊列發送一個消息 |
msgQreceive( ) | 從一個消息隊列接受一個消息 |
舉個栗子程序:任務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;
}