tmserv.cpp
来自「DOS下的一个通用定时器程序」· C++ 代码 · 共 163 行
CPP
163 行
/*-----------------------------------------------------------
File Name : tmserv.cpp
Version : 1.0
Date : 6/10/2002
Author : Hailong He
Description : time manager and server
-------------------------------------------------------------*/
#define NULL 0
#include "tmserv.h"
#include <stdio.h>
#include <malloc.h>
volatile unsigned long ticks=0;
static struct timer_list timer_head
= {0, 0, ~0, ~0, 0, NULL, &timer_head, &timer_head};
void interrupt far (*old_timer_int)(...);
void interrupt far (*old_sync_int)(...);
static void run_timer_list(void)
{
struct timer_list *timer, *tm_ptr;
void (*fn)(unsigned long);
unsigned long data;
timer = timer_head.next;
while(timer != &timer_head)
{
if(timer->expires <= ticks)
{
fn = timer->function;
data = timer->data;
if(timer->interval > 0)
{
timer->expires = ticks+timer->interval;
timer = timer->next;
}
else
{
tm_ptr = timer;
timer->next->prev = timer->prev;
timer->prev->next = timer->next;
timer=timer->next;
disable();
free(tm_ptr);
enable();
}
disable();
fn(data);
enable();
}
else
{
timer = timer->next;
}
}
}
void interrupt far new_timer_int(...){
disable();
++ticks;
run_timer_list();
outportb(0x20,0x20);
enable();
}
volatile int TIMEFLAG=0;
void interrupt far new_sync_int(...){
disable();
ticks-=ticks%20;
TIMEFLAG=1;
enable();
outportb(0x20, 0x20);
outportb(0xA0, 0x20);
}
void ClockOn(void){
disable();
ticks=0;
old_timer_int=getvect(0x08);
setvect(0x08, new_timer_int);
outportb(0x43, 0x36);
outportb(0x40, LATCH & 0xFF); //write LSB
outportb(0x40, LATCH >> 8); //write MSB
enable();
}
void SyncOn(void){
disable();
old_sync_int=getvect(0x74);
setvect(0x74, new_sync_int);
outportb(0x21, inportb(0x21)&0xFB);
outportb(0xA1, inportb(0xA1)&0xEF);
enable();
outportb(0x20,0x20);
outportb(0xA0,0x20);
}
void SyncOff(void){
disable();
setvect(0x74, old_sync_int);
outportb(0xA1, inportb(0xA1)|(~(0xEF)));
enable();
}
void ClockOff(void){
disable();
outportb(0x43, 0x36);
outportb(0x40, 0);
outportb(0x40, 0);
setvect(0x08, old_timer_int);
enable();
}
//add timer use copy, this method use in period timer
void add_tm(struct timer_list *tm)
{
disable();
tm->prev = timer_head.prev;
tm->next = &timer_head;
tm->prev->next = tm;
timer_head.prev = tm;
enable();
}
//add timer dynamic, this method use int temp timer
void add_timer(int tm_id, unsigned long tm_rt, unsigned long tm_expires,
unsigned long tm_interval, unsigned long tm_data,
void(*tm_fn)(unsigned long))
{
struct timer_list *tm;
tm = (struct timer_list*)malloc(sizeof(struct timer_list));
tm->timer_identity = tm_id;
tm->real_time = tm_rt;
tm->expires = tm_expires;
tm->interval = tm_interval;
tm->data = tm_data;
tm->function = tm_fn;
disable();
tm->prev = timer_head.prev;
tm->next = &timer_head;
tm->prev->next = tm;
timer_head.prev = tm;
enable();
}
//delete the timer
void delete_timer(int tm_id)
{
struct timer_list *tm_ptr;
tm_ptr= timer_head.next;
while(tm_ptr != &timer_head)
{
if(tm_ptr->timer_identity == tm_id)
{
tm_ptr->interval = 0;
tm_ptr->expires = 0;
}
tm_ptr = tm_ptr->next;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?