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 + -
显示快捷键?