2008-09-23 64 views
3

我們有一個vxWorks設計,它需要一個任務來處理通過兩個消息隊列發送的高優先級和低優先級消息。
給定優先級的消息必須按先進先出順序處理。任務如何等待多個vxworks隊列?

例如,按照接收到的順序處理所有高優先級消息,然後處理低優先級消息。如果沒有高優先級消息,則立即處理低優先級消息。

有沒有辦法做到這一點?

+0

如果他們要處理的FIFO,爲什麼會有兩個隊列?當然,一個隊列是更好的解決方案。 而且,如果它們被處理爲FIFO,那麼高優先級和低優先級的概念意味着什麼(高位不能繞過FIFO中的低位)? – paxdiablo 2008-09-23 12:29:59

回答

3

如果使用命名管道(pipeDevCreate(),write(),read())而不是消息隊列,則可以使用select()來阻塞,直到任一管道中都有消息。

只要select()觸發,就會處理高優先級管道中的所有消息。然後您從低優先級管道處理單個消息。然後再次調用select(循環)。

示例代碼片段:

// Initialization: Create high and low priority named pipes 
pipeDrv(); //initialize pipe driver 
int fdHi = pipeDevCreate("/pipe/high",numMsgs,msgSize); 
int fdLo = pipeDevCreate("/pipe/low",numMsgs,msgSize); 

... 

// Message sending thread: Add messages to pipe 
write(fdHi, buf, sizeof(buf)); 

... 

// Message processing Thread: select loop 
fd_set rdFdSet; 

while(1) 
{ 
    FD_ZERO(&rdFdSet); 
    FD_SET(fdHi, &rdFdSet); 
    FD_SET(fdLo, &rdFdSet; 

    if (select(FD_SETSIZE, &rdFdSet, NULL, NULL, NULL) != ERROR) 
    { 
     if (FD_ISSET(fdHi, &rdFdSet)) 
     { 
      // process all high-priority messages 
      while(read(fdHi,buf,size) > 0) 
      { 
       //process high-priority 
      } 
     } 

     if (FD_ISSET(fdLo, &rdFdSet)) 
     { 
      // process a single low priority message 
      if (read(fdLo,buf,size) > 0) 
      { 
       // process low priority 
      } 
     } 
    } 
} 
1

在vxWorks中,您不能直接等待多個隊列。但是,您可以使用OS事件(來自eventLib)來實現此結果。 下面是一個簡單的代碼片段:


MSG_Q_ID lowQ, hiQ; 

void Init() { 
// Task Initialization Code. This should be called from the task that will 
// be receiving the messages 
... 
hiQ = msgQCreate(...); 
lowQ = msgQCreate(...); 
msgQEvStart(hiQ, VX_EV01); // Event 1 sent when hiQ receives message 
msgQEvStart(loQ, VX_EV02); // Event 2 sent when loQ receives message 
... 
} 
void RxMessages() { 
... 
    UINT32 ev; // Event received 

    // Blocks until we receive Event 1 or 2 
    eventReceive(VX_EV01 | VX_EV02, EVENT_WAIT_ANY, WAIT_FOREVER, &ev); 
    if(ev & VX_EV01) { 
     msgQReceive(hiQ, ...); 
    } 
    if(ev & VX_EV02) { 
     msgQReceive(loQ, ...); 
    } 
} 

請注意,您需要修改代碼以確保你耗盡所有的隊列,以防有是收到多條信息。

同樣的機制也可以應用於使用semEvStart()函數的二進制信號量。

+0

我有一個嘮叨的感覺,這可以允許一個嗨消息之前處理消息,但不知道VxWorks所以不能證明它。如果在處理消息時,會將另一個消息,然後是一個消息添加到隊列中,會發生什麼情況? – 2008-09-23 13:21:55