كيف يمكن لمهمة الانتظار في قوائم انتظار vxworks المتعددة؟

StackOverflow https://stackoverflow.com/questions/120561

  •  02-07-2019
  •  | 
  •  

سؤال

لدينا تصميم vxWorks الذي يتطلب مهمة واحدة لمعالجة كل من الرسائل ذات الأولوية العالية والمنخفضة المرسلة عبر قائمتي انتظار للرسائل.
يجب معالجة الرسائل الخاصة بأولوية معينة بترتيب FIFO.

على سبيل المثال، قم بمعالجة كافة الرسائل ذات الأولوية العالية بالترتيب الذي تم تلقيها بها، ثم قم بمعالجة الرسائل ذات الأولوية المنخفضة.إذا لم تكن هناك رسالة ذات أولوية عالية، فقم بمعالجة الرسالة ذات الأولوية المنخفضة على الفور.

هل هناك طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم الأنابيب المسماة (pipeDevCreate()، write()، 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، لا يمكنك الانتظار مباشرة في قوائم انتظار متعددة.ومع ذلك، يمكنك استخدام أحداث نظام التشغيل (من eventsLib) لتحقيق هذه النتيجة.فيما يلي مقتطف رمز بسيط:


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