문제

우리는 vxWorks 디자인을 요구하는 하나의 작업 과정을 모두 높은 우선순위가 낮은 전송된 메시지 두 가지 이상의 메시지 큐입니다.
메시지에 대한 우선권이 주어야 하 FIFO 순서로 처리됩니다.

예를 들어,프로세스의 모든 우선 순위가 높은 메시지를 순서대로 받아,다음 프로세스의 우선순위가 낮은 메시지입니다.이 없는 경우 우선 순위가 높은 메시지가 표시되면,프로세스의 우선순위가 낮은 즉시 메시지.

는 방법이 있을까요?

도움이 되었습니까?

해결책

당신이 사용하는 경우 이름이 파이프(pipeDevCreate(),쓰기,(),read())신의 메시지 큐,사용할 수 있는 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()함수입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top