タスクはどのようにして複数の vxworks キューで待機できますか?
質問
2 つのメッセージ キューを介して送信される優先度の高いメッセージと低いメッセージの両方を処理するために 1 つのタスクを必要とする vxWorks 設計があります。
特定の優先度のメッセージは、FIFO 順序で処理する必要があります。
たとえば、優先度の高いメッセージをすべて受信順に処理してから、優先度の低いメッセージを処理します。優先度の高いメッセージがない場合は、優先度の低いメッセージをすぐに処理します。
これを行う方法はありますか?
解決
メッセージ キューの代わりに名前付きパイプ (pipeDevCreate()、write()、read()) を使用する場合は、いずれかのパイプにメッセージが存在するまで select() を使用してブロックできます。
select() がトリガーされるたびに、優先度の高いパイプ内のすべてのメッセージが処理されます。次に、優先度の低いパイプからの 1 つのメッセージを処理します。次に、もう一度 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
}
}
}
}
他のヒント
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() 関数を使用して、同じメカニズムをバイナリ セマフォに適用することもできます。
所属していません StackOverflow