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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tskinst.c

?? 一個多任務操作系統CTask的源代碼 用C語言編寫
?? C
字號:
/*
   --- Version 2.2 90-11-22 12:03 ---

   TSKINST.C - CTask - Install/Remove main tasker.

   CTask - a Multitasking Kernel for C

   Public Domain Software written by
      Thomas Wagner
      Ferrari electronic Gmbh
      Beusselstrasse 27
      D-1000 Berlin 21
      Germany

   No rights reserved.

   Version 2.1 separates the functions previously collected in tskmain.c into
         tskmain.c - Front ends for installation/removal
         tskinst.c - Install/Remove main kernel
         tskgrp.c  - Create/remove groups
         tsktask.c - Task creation and deletion
         tsktutl.c - Task utilities (get/set priority etc.)
         tskutil.c - General utilities (preemption, t_delay)

   Added in version 2.1: Debug support and NDP checking.
*/

#include "tsk.h"
#include "tsklocal.h"

#define STACKSIZE 512

/*
   The tcb's of the standard tasks.

      timer_tcb   is the tcb for the timer task.
                  This task waits for the tsk_timer_counter, which is
                  increased on every timer tick. It processes the entries
                  in the timeout queue.

      int8_tcb    is the tcb for the int8 chain task.
                  This task waits for the tsk_int8_counter, which is
                  increased on every system timer tick. It then chains to
                  the previous timer interrupt entry. If the IFL_INT8_EARLY
                  installation flag is set, this task will only be awakened
                  if the timer interrupt occurs during scheduler execution.
                  If the INT8_EARLY configuration flag is TRUE, this tcb
                  is not created.

      main_tcb    is the "main" task which called "install_tasker". This
                  task has no separate stack, rather the stack on entry
                  to the scheduler is used. Since main_tcb is not used
                  if this is a secondary invocation of CTask, "main_ptr"
                  points to the main_tcb for a primary invocation, and
                  to the underlying task for a secondary invocation.

      kill_tcb    is the tcb for the "kill" task. This task is only
                  used when dynamic allocation is enabled. Its only
                  purpose is to dispose of a dynamically allocated TCB,
                  and/or a dynamically allocated task stack. This task
                  was added in version 2.1 to fix a problem with killing
                  the current task when there were dynamically allocated
                  elements in it.
*/

/* 
   The following variables are never directly accessed from shared code,
   so they can be defined locally.
*/

local tcb timer_tcb;
local tcb main_tcb;

#if (TSK_DYNAMIC)
local tcb kill_tcb;
local char kill_stack [STACKSIZE];
#endif

local char timer_stack [STACKSIZE];

#if (IBM && !INT8_EARLY)
local tcb int8_tcb;
local char int8_stack [STACKSIZE];
#endif

#if (CODE_SHARING)
extern byte tsk_jmptab [];
#endif

/* 
   The following variables are local to the primary invocation.
   They are referenced from the timer task.
*/

counter Neardata tsk_timer_counter;

#if (IBM && !INT8_EARLY)
counter Neardata tsk_int8_counter;
#endif

/* --------------------------------------------------------------------- */

#if (TSK_DYNAMIC)

/*
   tsk_kill is awakened directly by the internal task kill routines
   if the current task is to be killed, and it has dynamically 
   allocated elements in it. Since the freeing of the dynamic elements
   may cause the task to be made waiting, this can't be done immediately 
   in certain situations. So the task is only marked as killed, and its
   queue head pointer is set to the kill_queue entry in the global variable
   block. The tsk_kill task is then marked as runable. The scheduler will
   enter the TCB into the kill_queue, and eventually activate tsk_kill.
*/

local void Taskfunc tsk_kill (void)
{
   tcbptr task;
   CRITICAL;

   while (1)
      {
      C_ENTER;
      task = (tcbptr)tsk_glob_rec.kill_queue.first;
      while (!(task->cqueue.kind & Q_HEAD))
         {
         tsk_dequeue (&task->cqueue);
         C_LEAVE;
         if (task->flags & F_STTEMP)
            tsk_pfree (task->stkbot);   /* Bug fixed in 2.1, was 'task->stack' */
         if (task->flags & F_TEMP)
            tsk_pfree (task);
         C_ENTER;
         task = (tcbptr)tsk_glob_rec.kill_queue.first;
         }
      kill_tcb.state = ST_STOPPED;
      kill_tcb.qhead = LNULL;
      schedule ();
      C_LEAVE;
      }
}

#endif

/* --------------------------------------------------------------------- */

/*
   tsk_install_main
      Installs the Ctask system. The internal tasks are created,
      the queues are initialised, and the interrupt handler installation
      routines are called. Task preemption is initially off.

      Handling of the speedup parameter is system dependent.
*/

int Globalfunc tsk_install_main (byte varpri, int speedup, word flags
                                TN(byteptr name))
{
   word divisor, sys_ticks;


   tsk_instflags = flags;

   tsk_glob_rec.current_task = &main_tcb;
#if (GROUPS)
   tsk_glob_rec.group.main_ptr = &main_tcb;
#else
   tsk_glob_rec.main_ptr = &main_tcb;
#endif

#if (!SINGLE_DATA)
   tsk_global = &tsk_glob_rec;
#endif
#if (GROUPS)
   main_tcb.group = &tsk_glob_rec.group;
#endif

#if (CODE_SHARING)
   tsk_glob_rec.stub_table = tsk_jmptab;
#else
   tsk_glob_rec.stub_table = LNULL;
#endif

   tsk_init_qhead (&tsk_glob_rec.eligible_queue, 0);
   tsk_init_qhead (&tsk_glob_rec.timer_queue, 0);
   tsk_init_qhead (&tsk_glob_rec.watch_queue, 0);

   tsk_glob_rec.preempt = 1;
   tsk_glob_rec.pretick = 0;
   tsk_glob_rec.var_prior = varpri;
   tsk_glob_rec.in_sched = 0;
   tsk_glob_rec.ticker_chain = LNULL;
#if (NDP)
   tsk_glob_rec.ndp_present = 0;  /* Init to 0 for creation of system tasks */
#endif

#if (GROUPS)
   tsk_glob_rec.group.branch = LNULL;
   tsk_create_group (&tsk_glob_rec.group, name);
   tsk_glob_rec.group.branch = LNULL;
   tsk_glob_rec.group.home = LNULL;

#if (DOS)
   tsk_glob_rec.group.save_psp = 0;
   tsk_glob_rec.emergency_exit = tsk_emergency_exit;

   tsk_install_dos ();
#endif
#else
   tsk_glob_rec.remove = LNULL;
#if (TSK_NAMED)
   tsk_init_qhead (&tsk_glob_rec.name_list.list, 0);
   tsk_glob_rec.name_list.name [0] = 0;
#endif
#endif
#if (EMS)
   tsk_install_ems ();
#endif

   /* 
      Call create_task to initialise the main task's TCB.
      Note that the function pointer and stack parameters are
      insignificant, but must be valid pointers (the stack is
      initialised, but not used).
   */

   create_task (&main_tcb, tsk_timer, timer_stack, STACKSIZE, 
                PRI_TIMER - 1, LNULL TN("-MAIN-"));

   main_tcb.qhead = &tsk_glob_rec.eligible_queue;
   main_tcb.state = ST_RUNNING;
   main_tcb.flags |= F_PERM;

#if (TSK_DYNAMIC && TSK_DYNLOAD)
   create_resource (&alloc_resource TN("ALLOCRSC"));
#endif

#if (TSK_DYNAMIC)
   tsk_init_qhead (&tsk_glob_rec.kill_queue, 0);
   create_task (&kill_tcb, tsk_kill, kill_stack, STACKSIZE, 
                PRI_STD, LNULL TN("-KILLER-"));
   kill_tcb.flags |= F_PERM;
   tsk_glob_rec.kill_task = &kill_tcb;
#endif

   create_task (&timer_tcb, tsk_timer, timer_stack, STACKSIZE, 
                PRI_TIMER, LNULL TN("-TIMER-"));
   timer_tcb.flags |= F_PERM;

   create_counter (&tsk_timer_counter TN("TIMCOUNT"));

   start_task (&timer_tcb);

#if (IBM && !INT8_EARLY)

   /* Note: to allow delayed timer ticks even with the INT8_DIR
      installation flag active, we must create the int8 task and
      counter without checking for the flag. Delayed ticks are 
      possible under the new interrupt handler scheme in version 2.1.
   */

   create_task (&int8_tcb, tsk_int8, int8_stack, STACKSIZE, PRI_INT8, LNULL
                  TN("-INT8-"));
   int8_tcb.flags |= F_PERM;

   create_counter (&tsk_int8_counter TN("INT8CNT"));
   start_task (&int8_tcb);

#endif

   /* NOTE: divisor/sys_ticks calculations are machine dependent. */

   if (speedup <= 0 || speedup > 8)
      {
      divisor = 0;
      sys_ticks = 1;
      tsk_glob_rec.ticks_per_sec = 0x0012;
      tsk_glob_rec.tick_factor = 0x36ED;
      }
   else
      {
      divisor = 1 << (16 - speedup);
      sys_ticks = 1 << speedup;
      tsk_glob_rec.ticks_per_sec =
         (0x1235 + (0x0080 >> speedup)) >> (8 - speedup);
      tsk_glob_rec.tick_factor =
         (0x36ED + (0x0080 >> (8 - speedup))) >> speedup;
      }

   tsk_install_timer (divisor, sys_ticks);

#if (HOTKEYS)
   tsk_init_qhead (&tsk_glob_rec.hotkey_scan, 0);
   tsk_init_qhead (&tsk_glob_rec.hotkey_noscan, 0);
#endif

#if (IBM)
   tsk_install_kbd ();

   if (flags & IFL_PRINTER)
      tsk_install_int17 ();
#endif

#if (AT_BIOS)
   if (flags & IFL_INT15)
      tsk_install_bios ();
#endif

#if (NDP)
   tsk_glob_rec.ndp_present = tsk_use_ndp = tsk_check_ndp ();
#endif

   return 0;
}


/* --------------------------------------------------------------------- */

/*
   tsk_remove_chain
      Calls the chained remove routines.
*/

void Globalfunc tsk_remove_chain (callchainptr chain)
{
   callchainptr curr;
   funcptr_ccp fn;

   while (chain != LNULL)
      {
      curr = chain;
      chain = chain->next;
      if ((fn = curr->func) != LNULL)
         {
         curr->func = LNULL;
         tsk_callfunc ((farptr)fn, curr);
         }
#if (TSK_DYNAMIC)
      if (curr->flags & F_TEMP)
         tsk_pfree (curr);
#endif
      }
}


/*
   tsk_remove_tasker
      Calls the interrupt handler un-install routines.
*/

void Globalfunc tsk_remove_tasker (void)
{
#if (!GROUPS)
   tsk_remove_chain (tsk_glob_rec.remove);
#endif

   tsk_glob_rec.preempt = 0;

#if (AT_BIOS)
   if (tsk_instflags & IFL_INT15)
      tsk_remove_bios ();
#endif

#if (IBM && !INT8_EARLY)

   /* Allow all stored clock ticks to be processed */

   if (!(tsk_instflags & IFL_INT8_DIR))
      {
      set_priority (&int8_tcb, 0xffff);
      while (check_counter (&tsk_int8_counter))
         schedule();
      }
#endif

#if (IBM)
   if (tsk_instflags & IFL_PRINTER)
      tsk_remove_int17 ();

   tsk_remove_kbd ();
#endif

   tsk_remove_timer ();

#if (DOS)
   tsk_remove_dos ();
#endif

   ctask_active = 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线免费视频一区二区| 国产精品少妇自拍| 国产精品理伦片| 三级欧美韩日大片在线看| 不卡一区在线观看| 2021中文字幕一区亚洲| 亚洲大片免费看| 91免费在线看| 国产亚洲美州欧州综合国| 午夜久久久影院| 91在线视频官网| 国产色婷婷亚洲99精品小说| 日韩不卡免费视频| 欧美性色黄大片手机版| 国产精品国产成人国产三级| 精品一区二区三区在线观看国产 | 天天影视涩香欲综合网| 99久久精品99国产精品| 国产欧美日韩激情| 精品在线一区二区| 在线电影欧美成精品| 一区二区三区四区激情| 99国产麻豆精品| 中文字幕一区二区在线播放| 丁香一区二区三区| 久久久精品国产免费观看同学| 久久福利资源站| 日韩女优av电影在线观看| 日本美女一区二区三区视频| 欧美精品xxxxbbbb| 亚洲国产精品嫩草影院| 欧美体内she精高潮| 又紧又大又爽精品一区二区| 色哟哟在线观看一区二区三区| 国产精品不卡在线观看| eeuss影院一区二区三区| 中文欧美字幕免费| 99在线精品观看| 国产精品久久久久影院亚瑟 | 亚洲精品一二三四区| 国产成人av电影免费在线观看| 久久久.com| 成人中文字幕合集| 亚洲欧美日韩中文字幕一区二区三区 | 日韩色视频在线观看| 美洲天堂一区二卡三卡四卡视频 | 欧美日韩国产在线播放网站| 午夜欧美视频在线观看 | 欧美顶级少妇做爰| 蜜桃视频在线观看一区| 久久久久久久久97黄色工厂| av中文字幕亚洲| 亚洲大型综合色站| 精品电影一区二区| 成人免费视频播放| 亚洲第一会所有码转帖| 日韩一区二区免费在线电影 | 91在线视频在线| 亚洲观看高清完整版在线观看| 日韩欧美国产午夜精品| 国产成人三级在线观看| 一区二区三区在线视频播放| 日韩一级完整毛片| 成人免费毛片片v| 亚洲综合在线五月| 欧美精品一区二区不卡| 91香蕉视频在线| 视频一区中文字幕国产| 日本一区二区三区在线观看| 欧美专区亚洲专区| 国产精品123| 亚洲成年人影院| 国产日韩欧美a| 91成人免费网站| 久久精品国产亚洲a| 亚洲欧美日韩国产一区二区三区 | 91在线观看成人| 精久久久久久久久久久| 国产精品久久久久精k8| 日韩一区二区精品在线观看| 99视频在线观看一区三区| 日韩激情在线观看| 国产精品久久久久7777按摩| 日韩三级视频在线看| 色综合久久久网| 国产91丝袜在线18| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲日本韩国一区| 欧美激情一区二区| 日韩你懂的在线播放| 欧美日韩美女一区二区| 99久久精品99国产精品| 福利一区二区在线| 韩国三级电影一区二区| 免费一级片91| 五月天欧美精品| 亚洲第一成人在线| 亚洲综合免费观看高清在线观看| 国产精品美女久久福利网站| 久久久久久久久久久久久久久99 | 欧美日韩国产综合一区二区| 91视频.com| www.亚洲人| 成人免费毛片app| 成人一区二区三区| 懂色av一区二区在线播放| 麻豆成人久久精品二区三区红| 日韩黄色免费电影| 天天操天天色综合| 亚洲18女电影在线观看| 亚洲综合男人的天堂| 一级女性全黄久久生活片免费| 亚洲欧美色一区| 一区二区三区国产精华| 一区二区三区欧美激情| 亚洲老司机在线| 亚洲婷婷综合色高清在线| 亚洲第一精品在线| 亚洲午夜免费电影| 亚洲小少妇裸体bbw| 亚洲高清一区二区三区| 丝袜美腿高跟呻吟高潮一区| 日本不卡一二三区黄网| 久久99国内精品| 国产高清不卡一区二区| 成人白浆超碰人人人人| 99精品久久只有精品| 欧美在线999| 欧美日韩电影在线播放| 欧美大片一区二区三区| 精品国产一区二区三区久久久蜜月 | 国产精品国产三级国产三级人妇 | 欧美视频在线一区二区三区 | 欧美午夜视频网站| 3atv一区二区三区| 日韩欧美一区在线| 国产人成亚洲第一网站在线播放| 国产精品女上位| 亚洲私人黄色宅男| 五月综合激情日本mⅴ| 蜜桃av一区二区在线观看| 国产一区二区日韩精品| 91原创在线视频| 欧美日韩成人综合| 欧美精品一区二区三区久久久| 国产精品久久久久久一区二区三区 | 色综合中文字幕国产 | 高清久久久久久| 色伊人久久综合中文字幕| 欧美高清视频在线高清观看mv色露露十八 | 色av综合在线| 精品日韩一区二区三区| 中文字幕亚洲在| 午夜精品久久久久久久久久久| 极品美女销魂一区二区三区 | 国产福利精品一区| 欧洲亚洲精品在线| 2023国产精品视频| 亚洲综合清纯丝袜自拍| 国产黄色精品网站| 欧美精品乱人伦久久久久久| 久久影视一区二区| 亚洲已满18点击进入久久| 国产精品亚洲一区二区三区妖精| 成人午夜视频网站| 欧美一区二区精美| 伊人色综合久久天天人手人婷| 国产一区二区三区四区在线观看| 日本大香伊一区二区三区| 国产欧美一区二区三区鸳鸯浴| 婷婷综合五月天| 91啪九色porn原创视频在线观看| 精品国产伦理网| 午夜精品免费在线观看| 91在线观看污| 国产精品网站在线| 国产综合色视频| 日韩欧美国产综合在线一区二区三区| 亚洲日本在线观看| 国产成人在线看| 精品国产亚洲一区二区三区在线观看| 亚洲图片欧美色图| 91福利在线观看| 亚洲日本在线视频观看| 成人激情开心网| 久久久久青草大香线综合精品| 日本成人超碰在线观看| 欧美日韩精品一二三区| 亚洲自拍偷拍麻豆| 色哟哟一区二区在线观看| 国产精品久久久久aaaa| 国产91精品欧美| 久久久精品国产免费观看同学| 久久99国产精品免费网站| 日韩女优电影在线观看| 麻豆精品蜜桃视频网站| 日韩免费看的电影| 久久99国产精品麻豆| 日韩美女一区二区三区四区| 日韩vs国产vs欧美|