dos.c

来自「这是状态机的一个框架结构的例子,可以作为状态机的基本架构」· C语言 代码 · 共 85 行

C
85
字号
/******************************************************************** 
 * Quantum Framework DOS port implemenatation (C version)
 * (c) Copyright 2001, Miro Samek, Palo Alto, CA
 * All Rights Reserved
 *******************************************************************/
#include "qassert.h"
#include "port.h"

DEFINE_THIS_FILE;

unsigned char pkgRdyMask;

/*.................................................................*/
const char *QFgetVersion() { 
   return "QF/DOS version 2.2.0";
}
/*.................................................................*/
void QFosInit__() { 
}
/*.................................................................*/
void QFosCleanup__() { 
}
/*.................................................................*/
void QFbackground() {
   static const unsigned char lbLkup[] = {
      0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
      5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 
   };

   while (pkgRdyMask) {
      QActive *a = pkgActive[lbLkup[pkgRdyMask]];
      register QEvent *evt = (QEvent *)QEQueueGet(&a->eQueue__);
      QHsmDispatch((QHsm *)a, evt);     /* dispatch evt to the HSM */
      QFpropagate__(evt);      /* propagate to the next subscriber */ 
   }   
}
/*.................................................................*/
int QActiveStart(QActive *me, unsigned prio, 
                 QEvent **qSto, unsigned qLen,
                 int *stkSto, unsigned stkLen)
{
   REQUIRE(0 < prio && prio <= QF_MAX_ACTIVE &&
           stkSto == 0);      /* DOS does not need per-actor stack */
   me->prio__ = prio;
   QFadd__(me);             /* make QF aware of this active object */ 
   if (!QEQueueCtor(&me->eQueue__, qSto, qLen)) {
      return 0;                                  /* return failure */
   }
   me->eQueue__.osEvent__ = 1 << (prio - 1); /*bit-mask 4 the actor*/
   QHsmInit((QHsm *)me, 0);          /* execute initial transition */
   return !0;                                    /* return success */
}
/*.................................................................*/
void QActiveStop(QActive *me) {
   QFremove__(me);
}
/*.................................................................*/
int QActiveEnqueue__(QActive *me, QEvent *evt) {
   return QEQueuePutFIFO(&me->eQueue__, evt); 
}
/*.................................................................*/
void QActivePostFIFO(QActive *me, QEvent *evt) {
   REQUIRE(evt->useNum == 0);          /* event must not be in use */
   ALLEGE(QEQueuePutFIFO(&me->eQueue__, evt));  /* cannot overflow!*/
}
/*.................................................................*/
void QActivePostLIFO(QActive *me, QEvent *evt) {
   REQUIRE(evt->useNum == 0);          /* event must not be in use */
   ALLEGE(QEQueuePutLIFO(&me->eQueue__, evt));  /* cannot overflow!*/
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?