亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? rtmk.c

?? 實(shí)時(shí)多重作業(yè)操作系統(tǒng)內(nèi)核(RTMK)。簡(jiǎn)單實(shí)時(shí)多重作業(yè)操作系統(tǒng)內(nèi)核源程序。RTMK支持消息和事件
?? C
字號(hào):
/************************************************************************
*
*  Module name         : RTMK.C
*
*  Module description  :
*     This module contains task management functions for RTMK.
*
*     About jmp_buf:
*      + Borland C++ compiler defines jmp_buf as a pointer to a data structure:
*           struct __jmp_buf
*           {
*              unsigned    j_sp;
*              unsigned    j_ss;
*              unsigned    j_flag;
*              unsigned    j_cs;
*              unsigned    j_ip;
*              unsigned    j_bp;
*              unsigned    j_di;
*              unsigned    j_es;
*              unsigned    j_si;
*              unsigned    j_ds;
*           };
*           to store information of registers.
*
*      + WatCom C++ compiler defines jmp_buf as a 13 integer array to store
*        information of registers:
*              [0]  = BX
*              [1]  = CX
*              [2]  = DX
*              [3]  = SI
*              [4]  = DI
*              [5]  = BP
*              [6]  = SP
*              [7]  = ES
*              [8]  = DS
*              [9]  = CS
*              [10] = IP
*              [11] = Don't know yet (flags ?)
*              [12] = SS
*
*  Project             : RTMK
*
*  Target platform     : DOS
*
*  Compiler & Library  : BC++ 3.1
*
*  Author              : Richard Shen
*
*  Creation date       : 16 August, 1995
*
************************************************************************/
#include <memory.h>

#ifdef __DOS__
#  include <stdlib.h>
#  include <dos.h>
#  include <signal.h>
#  include <conio.h>
#endif /* __DOS__ */

#include <rtmk.h>
#include <errors.h>
#include "rtmkloc.h"

/************************************************************************
*                 S T A T I C    V A R I A B L E S                      *
************************************************************************/
/*
   NOTE: numProcess declared as FAR, when it is referenced by Borland C++
         compiler, ES register will be used.
*/
#ifdef __DOS__
static int far    numProcess; /* Number of Processes created */
#else
static int        numProcess; /* Number of Processes created */
#endif /* __DOS__ */

/************************************************************************
*  Function name   : RtmkRun
*  Description     : Main entry point of RTMK kernel
*                  :
*  Parameters      : -
*  Returns         : SUCCESSFUL
*  Author          : Richard Shen
* -----------------------------------------------------------------------
*  Date     By      Description
* -----------------------------------------------------------------------
*  16Aug95  RCS     Created.
************************************************************************/
uint RtmkRun(void)
{
   /* Initialise kernel data */
   memset(&pcsTable[0], 0, sizeof(pcsTable));

   numProcess   = 0;
   curProcess   = NULL;
   readyProcess = 0;

#ifdef __DOS__
   servingInt   = FALSE;
#endif /* __DOS__ */

   /* Create the default task */
   RtmkStartTask(&curProcess, NULL, 0);

   Scheduler(NULL, FALSE);

   return(SUCCESSFUL);
} /* RtmkRun() */

/************************************************************************
*  Function name   : RtmkStartTask
*  Description     : Create an application task
*                  :
*  Parameters      : process     - Task control block
*                  : taskEntry   - Task entry point. NULL if running code
*                  : stackSize   - Size of task's stack
*  Returns         : -
*  Author          : Richard Shen
* -----------------------------------------------------------------------
*  Date     By      Description
* -----------------------------------------------------------------------
*  16Aug95  RCS     Created.
************************************************************************/
uint RtmkStartTask(PROCESS *process, void (*taskEntry)(void), uint stackSize)
{
   uint     procMask;

#ifdef __DOS__
   char far    *stack;
#endif /* __DOS__ */

   /* Last task is the kernel task */
   if (numProcess > MAX_TASKS - 1)
   {
      *process = NULL;
      return(ERR_MAX_TASKS);
   } /* end of if */

   *process = &pcsTable[numProcess];

   if (taskEntry)
   {
#ifdef __DOS__
      /* Register application task to kernel */
#if defined __TURBOC__
      (*process)->context->j_ip   = FP_OFF(taskEntry);
      (*process)->context->j_cs   = FP_SEG(taskEntry);
      (*process)->context->j_flag = 0;

      /* Process stack */
      stack = (char far *)calloc(stackSize, sizeof(char));
      if (stack == NULL)
      {
         *process = NULL;
         return(ERR_STACK);
      } /* end of if */

      /*
         Set up segment registers.  By default, the compiler assumes that
         SS is equal to DS for small, tiny or medium module.  For large,
         huge or compact module, DS is not equal to SS.
      */
      (*process)->context->j_ss = FP_SEG((void far *)stack);
      (*process)->context->j_sp = (uint )stack + stackSize;
      (*process)->context->j_bp = (*process)->context->j_sp;   /* Assume BP = SP */

      /* Set up DS register */
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
      (*process)->context->j_ds = _DS;
#else
      (*process)->context->j_ds = (*process)->context->j_ss;
#endif /* __LARGE || __HUGE__ || __COMPACT__ */

      /* Set up ES register */
      (*process)->context->j_es = _ES;

      /* Set up flags register */
      (*process)->context->j_flag = _FLAGS;

#elif defined __WATCOMC__

      /* Process stack */
      stack = (char far *)calloc(stackSize, sizeof(char));
      if (stack == NULL)
      {
         *process = NULL;
         return(ERR_STACK);
      } /* end of if */

      (*process)->context[6]  = (uint )stack + stackSize;   /* SP      */
      (*process)->context[5]  = (*process)->context[6];     /* BP = SP */
      (*process)->context[7]  = sysContext[7];              /* ES      */
      (*process)->context[8]  = sysContext[8];              /* DS      */
      (*process)->context[9]  = FP_SEG(taskEntry);          /* CS      */
      (*process)->context[10] = FP_OFF(taskEntry);          /* IP      */
      (*process)->context[12] = FP_SEG((void far *)stack);  /* SS      */
#endif /* __TURBOC__ else __WATCOMC__ */

#else
   /* Allocate stack for application task using target specific compiler */

   /* Then set up process context */

#endif /* __DOS__ */
   } /* end of if */

   (*process)->evWait     = 0;                     /* No waiting events    */
   (*process)->evReceived = 0;                     /* No received events   */
   procMask            = READY_MASK >> numProcess; /* Set up task status   */
   (*process)->procMask   = procMask;
   (*process)->priority   = MAX_TASKS - numProcess;/* Set up priority      */
   (*process)->msgPending = FALSE;                 /* No message pending   */
   (*process)->msgSender  = NULL;

   numProcess++;                                   /* Update process counter */
   DisableInterrupt();
   readyProcess |= procMask;    /* The process is now ready to take the CPU */
   EnableInterrupt();

   return(SUCCESSFUL);
} /* RtmkStartTask() */

/************************************************************************
*  Function name   : Scheduler
*  Description     : The context of the current process is saved and the
*                  : system switch to the ready process.  If nextProcess
*                  : is NULL, the higher priority ready process is searched,
*                  : else the process is the ready process.
*                  :
*  Parameters      : nextProcess - Process to be scheduled to
*                  : ronudRobin  - TRUE if manual round robin
*  Returns         : -
*  Author          : Richard Shen
* -----------------------------------------------------------------------
*  Date     By      Description
* -----------------------------------------------------------------------
*  16Aug95  RCS     Created.
************************************************************************/
void Scheduler(PROCESS nextProcess, BOOLEAN roundRobin)
{
   PROCESS  highest;
   int      count;
   uint     mask;
   uint     maxPrior;

   /* Save the context of current process */
   if (!setjmp(curProcess->context))
   {
      if (nextProcess && roundRobin == FALSE)
         curProcess = nextProcess;
      else
      {
         highest  = NULL;
         while (highest == NULL)
         {
            mask     = READY_MASK;
            maxPrior = 0;

            for (count = 0; count < MAX_TASKS; count++)
            {
               if ((mask & readyProcess) != 0)
               {
                  /* Keep searching for highest priority process */
                  if (maxPrior < pcsTable[count].priority)
                  {
                     highest  = &pcsTable[count];
                     maxPrior = highest->priority;
                  } /* end of if */
               } /* end of if */
               mask >>= 1;
            } /* end of for */

            /*
               If highest is NULL, no ready task found, just wait.
               Some tasks might just wait for a hardware interrupt event.
            */
            if (highest)
            {
               if (highest == curProcess)
               {
                  if ((readyProcess & highest->procMask))
                     return;
                  highest = NULL;   /* Current task is in wait mode */
                  continue;
               } /* end of if */
               curProcess = highest;
            } /* end of if */
         } /* end of while */
      } /* end of else */

      longjmp(curProcess->context, 1); /* Switch to the scheduled process */
   } /* end of if */
} /* Scheduler() */

/************************************************************************
*  Function name   : RtmkChangePriority
*  Description     : Change priority of a task
*                  :
*  Parameters      : process     - Task control block
*                  : newPriority - New priority
*  Returns         : priority changed to, or ERR_TASK_ID if invalid task ID
*  Author          : Richard Shen
* -----------------------------------------------------------------------
*  Date     By      Description
* -----------------------------------------------------------------------
*  16Aug95  RCS     Created.
************************************************************************/
uchar RtmkChangePriority(PROCESS process, uchar newPriority)
{
   uchar    oldPriority;

   oldPriority       = process->priority;
   process->priority = newPriority;

   return(oldPriority);
} /* RtmkChangePriority() */

/************************************************************************
*  Function name   : RtmkGetPriority
*  Description     : Get priority of a task
*                  :
*  Parameters      : tid   - Task control block
*  Returns         : priority changed to, or ERR_TASK_ID if invalid task ID
*  Author          : Richard Shen
* -----------------------------------------------------------------------
*  Date     By      Description
* -----------------------------------------------------------------------
*  16Aug95  RCS     Created.
************************************************************************/
uchar RtmkGetPriority(PROCESS process)
{
   return(process->priority);
} /* RtmkGetPriority() */

/************************************************************************
*  Function name   : RtmkCurrent
*  Description     : Get current running process control block
*                  :
*  Parameters      : -
*  Returns         : curProcess
*  Author          : Richard Shen
* -----------------------------------------------------------------------
*  Date     By      Description
* -----------------------------------------------------------------------
*  22Aug95  RCS     Created.
************************************************************************/
PROCESS RtmkCurrent(void)
{
   return(curProcess);
} /* RtmkCurrent() */

/************************************************************************
*  Function name   : EnableInterrupt
*  Description     : Enables interrupts
*                  :
*  Parameters      : -
*  Returns         : -
*  Author          : Richard Shen
* ----------------------------------------------------------------------
*  Date     By      Description
* ----------------------------------------------------------------------
*  09Oct95  RCS     Created.
************************************************************************/
void EnableInterrupt(void)
{
   if (servingInt == 0)
      enable();
} /* EnableInterrupt() */

/************************************************************************
*  Function name   : DisableInterrupt
*  Description     : Disables interrupts
*                  :
*  Parameters      : -
*  Returns         : -
*  Author          : Richard Shen
* ----------------------------------------------------------------------
*  Date     By      Description
* ----------------------------------------------------------------------
*  09Oct95  RCS     Created.
************************************************************************/
void DisableInterrupt(void)
{
   if (servingInt == 0)
      disable();
} /* DisableInterrupt() */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线观看视频| 欧美专区在线观看一区| 亚洲欧洲国产日本综合| 91麻豆精品国产无毒不卡在线观看| 激情偷乱视频一区二区三区| 亚洲色图都市小说| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美不卡视频一区| 色婷婷久久久亚洲一区二区三区| 精品一区二区三区免费毛片爱| 一区二区在线观看免费视频播放| 国产性色一区二区| 制服丝袜成人动漫| 欧美午夜精品久久久久久超碰| 国产成人精品免费网站| 另类调教123区| 视频在线观看一区| 一区二区三区在线视频免费| 国产欧美日韩一区二区三区在线观看| 日韩三级伦理片妻子的秘密按摩| 在线日韩一区二区| 99精品在线免费| 国产v综合v亚洲欧| 麻豆国产精品视频| 免费精品视频在线| 亚洲在线观看免费视频| 亚洲图片另类小说| 国产精品系列在线| 国产精品伦理一区二区| 日韩精品在线网站| 337p亚洲精品色噜噜| 欧美性大战xxxxx久久久| 99久久夜色精品国产网站| 成人开心网精品视频| 国产一区二区三区美女| 麻豆精品精品国产自在97香蕉| 天堂va蜜桃一区二区三区漫画版 | 蜜臀a∨国产成人精品| 亚洲电影第三页| 亚洲综合另类小说| 亚洲精品国产一区二区三区四区在线| 国产日韩欧美一区二区三区乱码 | 亚洲日本免费电影| 国产精品久久福利| 国产精品视频一区二区三区不卡| 国产日本欧美一区二区| 国产清纯白嫩初高生在线观看91 | 欧美性猛交xxxxxx富婆| 日本久久精品电影| 色哟哟亚洲精品| 在线视频观看一区| 欧美专区日韩专区| 欧美亚洲图片小说| 欧美精品一级二级| 日韩美女视频在线| 久久综合精品国产一区二区三区 | 国产精品久久久久久亚洲伦| 欧美国产欧美综合| 亚洲精品一二三| 亚洲444eee在线观看| 天天色综合天天| 久久国产精品免费| 成人av资源站| 欧美日韩一区二区三区在线看 | 麻豆精品在线看| 国产一区在线精品| 91视视频在线观看入口直接观看www | 欧美色综合影院| 欧美一卡2卡三卡4卡5免费| 26uuu亚洲| 樱桃视频在线观看一区| 日本欧美一区二区三区| 国产成人av资源| 欧美日韩久久一区| 久久久久久一二三区| 一区二区在线观看视频在线观看| 热久久国产精品| 成人综合婷婷国产精品久久| 欧美午夜精品一区二区三区| 精品人在线二区三区| 中文字幕一区二| 男人的天堂久久精品| 欧美一区二区三区色| 国产亚洲一本大道中文在线| 亚洲九九爱视频| 国产在线视频不卡二| 色婷婷综合久色| 精品嫩草影院久久| 亚洲美女屁股眼交| 国产又黄又大久久| 欧美亚洲一区三区| 国产精品三级av| 日本欧洲一区二区| 91丨九色porny丨蝌蚪| 欧美大片在线观看一区| 一区二区三区欧美日| 国产激情一区二区三区桃花岛亚洲| 欧洲日韩一区二区三区| 日本一区二区久久| 麻豆久久久久久久| 欧美日韩综合在线| 亚洲欧洲日产国码二区| 久国产精品韩国三级视频| 色吧成人激情小说| 国产精品久久一卡二卡| 精品一区二区在线观看| 欧美亚一区二区| 国产精品国产三级国产专播品爱网 | 亚洲欧美怡红院| 狠狠色狠狠色合久久伊人| 在线播放/欧美激情| 一区二区在线观看免费视频播放| 粉嫩一区二区三区性色av| 欧美卡1卡2卡| 一区二区三区国产豹纹内裤在线| 成人伦理片在线| 久久久久久99久久久精品网站| 日韩福利视频网| 欧美日韩中文字幕一区二区| 亚洲视频免费看| 成人精品小蝌蚪| 久久久久久久电影| 久久国产精品第一页| 欧美高清激情brazzers| 亚洲国产日产av| 色婷婷av一区二区三区gif | 5858s免费视频成人| 亚洲综合区在线| 在线观看三级视频欧美| 一区二区三区四区乱视频| 91小视频在线观看| 国产精品成人在线观看| 不卡的av在线播放| 国产精品国产自产拍高清av王其| 国产91富婆露脸刺激对白 | 午夜私人影院久久久久| 欧美性一区二区| 亚洲午夜一区二区| 欧美剧情电影在线观看完整版免费励志电影 | 精品少妇一区二区三区日产乱码| 水野朝阳av一区二区三区| 欧美日韩国产综合一区二区三区| 一区二区三区不卡视频在线观看 | 一区二区欧美在线观看| 136国产福利精品导航| av电影天堂一区二区在线| 中文字幕在线不卡视频| 日本高清无吗v一区| 夜夜揉揉日日人人青青一国产精品| 欧美在线一二三四区| 午夜精品久久久久久久99樱桃| 在线91免费看| 久久精工是国产品牌吗| 欧美精品一区二区三区在线播放| 国产成人日日夜夜| 亚洲色图视频免费播放| 欧美日韩一区中文字幕| 蜜桃久久av一区| 久久精品在线免费观看| 91亚洲资源网| 午夜精品视频一区| 久久久久久电影| 91免费在线视频观看| 午夜精品久久久| 久久这里都是精品| 91亚洲国产成人精品一区二区三 | 欧美日韩精品免费观看视频| 午夜精品久久久久久久久久久| 日韩欧美在线观看一区二区三区| 国产精品伊人色| 一区二区高清免费观看影视大全 | 亚洲日本青草视频在线怡红院| 欧洲日韩一区二区三区| 蜜臀精品一区二区三区在线观看 | 亚洲免费av观看| 欧美男生操女生| 国产精品一线二线三线| 亚洲乱码精品一二三四区日韩在线| 欧美私模裸体表演在线观看| 日韩一区精品视频| 欧美激情一区二区三区全黄| 色av成人天堂桃色av| 免费在线观看成人| 中文字幕一区二区三区视频| 欧美日韩免费高清一区色橹橹| 免费人成在线不卡| 亚洲色图视频网| 91精品国产日韩91久久久久久| 国产剧情在线观看一区二区| 亚洲bt欧美bt精品| 国产午夜精品一区二区| 欧美日韩国产系列| 国产高清精品久久久久| 亚洲成人一二三| 国产精品久久久久久久久图文区| 欧美丰满少妇xxxxx高潮对白| 国产精品一卡二卡| 亚洲18色成人| 中文字幕一区二区不卡| 久久久噜噜噜久久人人看|