Pregunta

Tenemos una vxWorks diseño que requiere una tarea de proceso de alta y baja prioridad de los mensajes enviados a través de dos colas de mensajes.
Los mensajes para una determinada prioridad tienen que ser procesados en orden FIFO.

Por ejemplo, procesar todos los mensajes de prioridad alta en el orden en que fueron recibidos, para luego procesar los mensajes de prioridad baja.Si no hay ningún mensaje de prioridad alta, para luego procesar el mensaje de prioridad baja inmediatamente.

Es allí una manera de hacer esto?

¿Fue útil?

Solución

Si el uso de canalizaciones con nombre (pipeDevCreate(), write(), read()) en lugar de las colas de mensajes, usted puede usar select() para bloquear hasta hay mensajes en cualquiera de las tuberías.

Cada vez que seleccione() activa, procesar todos los mensajes de alta prioridad de la tubería.Luego de procesar un único mensaje de la baja prioridad de la tubería.A continuación, seleccione de nuevo (loop).

Ejemplo fragmentos de Código:

 // 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
             }
         }
     }
 }

Otros consejos

En vxWorks, usted no puede esperar directamente en varias colas.Sin embargo, puede utilizar los eventos de sistema operativo (de eventLib) para lograr este resultado.Aquí es un simple fragmento de código:


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, ...);
   }
}

Tenga en cuenta que usted necesita para modificar el código para asegurarse de que se fuga de todos sus colas en caso de que exista más de un mensaje que fue recibido.

El mismo mecanismo puede aplicarse también a los semáforos Binarios utilizando el semEvStart() función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top