⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tskporw.c

📁 一个多任务操作系统CTask的源代码 用C语言编写
💻 C
字号:
/*
   --- Version 2.2 90-10-12 10:33 ---

   TSKPORW.C - CTask - Port watch operations.

   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.

   This file is new with 2.1. The port watch related functions were moved
   from tsktimer to this module.

   Version 2.2 adds a create routine that does not enqueue the created
   element. Separate enable and disable routines have been added in
   tsktsub.c.
*/

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

#include <stdarg.h>

/*
   create_port_watch_elem
      Creates a port watch element.
*/

tlinkptr CGlobalfunc create_port_watch_elem (tlinkptr elem, word port, 
                                             byte in_word, word mask, 
                                             word compare, byte cmpkind,
                                             farptr strucp, byte kind, 
                                             int rept, ...)
{
   va_list val;

   if (cmpkind < TCMP_EQ || cmpkind > TCMP_CHG)
      return LNULL;

   va_start (val, rept);
   elem = tsk_setup_telem (elem, TYP_WATCH, strucp, kind, va_arg (val, dword));
   va_end (val);
   if (elem == LNULL)
      return LNULL;

   if (rept)
      elem->flags |= TFLAG_REPEAT;
   elem->elkind = (byte)(TELEM_PORT | cmpkind);
   elem->elem.port.port = port;
   elem->elem.port.in_word = in_word;
   elem->elem.port.mask = mask;
   elem->elem.port.compare = compare;

   return elem;
}

/*
   create_port_watch
      Creates a port watch element and activates it.
      For compatibility to previous versions only.
*/

tlinkptr CGlobalfunc create_port_watch (tlinkptr elem, word port, byte in_word,
                                        word mask, word compare, byte cmpkind,
                                        farptr strucp, byte kind, int rept, ...)
{
   va_list val;

   va_start (val, rept);
   elem = create_port_watch_elem (elem, port, in_word, mask, compare, cmpkind,
                                  strucp, kind, rept, va_arg (val, dword));
   va_end (val);
   if (elem != LNULL)
      enable_watch (elem);

   return elem;
}


/*
   wait_port
      Delay current task until specified port watch condition is met.
*/

int Globalfunc wait_port (word port, byte in_word,
                          word mask, word compare, byte cmpkind)
{
   tlinkptr elem;
   tcbptr task = GLOBDATA current_task;

   if (cmpkind < TCMP_EQ || cmpkind > TCMP_CHG)
      return 1;

   elem = &task->timerq;
   elem->link.kind = TYP_WATCH;
   elem->struckind = TKIND_WAKE;
   elem->elkind = (byte)(TELEM_PORT | cmpkind);
   elem->flags = 0;
   elem->elem.port.port = port;
   elem->elem.port.in_word = in_word;
   elem->elem.port.mask = mask;
   elem->elem.port.compare = compare;

   tsk_cli ();
   task->state = ST_DELAYED;
   task->qhead = LNULL;

   tsk_putqueue (&GLOBDATA watch_queue, &elem->link);

   schedule ();
   return (int)((dword)task->retptr);
}

⌨️ 快捷键说明

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