ngeow@bucsb.UUCP (Yee Kwong Ngeow) (04/24/89)
Hi.. I am trying to do some mutittasking on a PS2 Model 70. I am in the process of writting an efficient multi user BBS, so I need to know how to change the timer interrupt of the PC to switch between program, using time quantumn method (round robin scheduling.) What I really need to know is can I modify the timer interrupt vector so that every fraction of a second (I presume 1/60th) the OS calls the handler, which switches the running process and returns? I am currently using Turbo C. Is there anyway to do it using this compiler? Feel free to be technical. I have taken the OS course :-) Thanks in advance, Kwong
osh@cbnewsh.ATT.COM (david.a.oshinsky) (04/25/89)
The following program demonstrates how to handle timer interrupts from Turbo C. Hope this helps, David Oshinsky AT&T Bell Laboratories Holmdel, NJ phone: (201)949-0037 uucp: att!houxs!osh ------------------------- Cut here -------------------------- /* 8253 timer test program for Turbo C 1.5/2.0. */ /* Author: David Oshinsky, 11/14/88. */ /* This program demonstrates how to use counter 0 in the */ /* 8253 chip to provide "real-time clock" functions on the */ /* IBM PC or PC/AT. */ /* SOME QUICK INFO ON PC INTERRUPTS: */ /* The interrupt lines INT2 through INT7 appear on the PC */ /* bus. INT0 and INT1 appear only on the motherboard. */ /* Interrupt line usage is as follows: */ /* INT0 is used by counter 0 of the 8253 programmable */ /* interval timer chip */ /* INT1 is used by the keyboard */ /* INT5 is used by the hard disk controller */ /* INT6 is used by the floppy disk controller */ /* The above is not completely accurate when applied to */ /* the PC/AT; however, the timer interrupt uses INT0 on */ /* both the PC and PC/AT. (This program works on both the */ /* PC and the PC/AT.) */ /* The 8259 Peripheral Interrupt Controller (PIC) chip */ /* maps the INTx line to interrupt number x+8 (this is */ /* programmable, set by MS-DOS). Hence, the timer */ /* interrupt is number 8. */ #include <dos.h> #define ZERO_FLAG 0x040 #define CONTROL_C 3 #define MS_PER_TICK 53 /* milliseconds per IBM PC clock tick */ unsigned long count; unsigned ticks; void interrupt timer(), interrupt (*old_handler)(); main() { union REGS sreg, rreg; /* time starts at zero */ count = 0; ticks = 0; /* initializations related to MS-DOS call to read keyboard */ sreg.x.dx = 0xff; sreg.h.ah = 0x06; printf("\nTo stop the timer test program, type CTRL-C."); printf("\nTo display time since starting the program, hit any key."); printf("\nThe time is accurate to roughly the nearest 1 msec.\n\n"); /* Save the address of the current timer interrupt handler */ old_handler = getvect(8); /* Call "timer" function when timer interrupt occurs. */ setvect(8, timer); /* Set up 8259 PIC chip to allow INT0 interrupt. */ outportb(0x21, inportb(0x21) & 0xfe); /* issue command to 8253: counter 0, binary counter, rate generator */ /* (mode 2), load least significant byte of counter followed by */ /* most significant byte */ outportb(0x43, 0x34); /* Timer is set for 0x4cd * 813.8 ns = 1 ms (LSB followed by MSB). */ outportb(0x40, 0xcd); /* least significant byte of timer count */ outportb(0x40, 0x04); /* most significant byte of timer count */ while (1) { /* wait for keystroke */ while ( 1 ) { intdos(&sreg, &rreg); if ( ! (rreg.x.flags & ZERO_FLAG) ) break; } /* stop the program if ctrl-C */ if ( (rreg.x.ax & 0xff) == CONTROL_C ) { /* NOTE: the following code MUST be executed before */ /* returning to MS-DOS in order to allow proper */ /* operation of programs which use the 8253 timer. */ /* restore 8253 to original state set during PC boot */ /* NOTE: this program leaves 8259 mask register with */ /* least significant bit clear (i.e., INT0 enabled). */ outportb(0x43, 0x34); outportb(0x40, 0); outportb(0x40, 0); /* restore original interrupt vector for number 8 */ setvect(8, old_handler); printf("Timer test program returning to MS-DOS.\n"); exit(0); } else printf("TIME = %lu MSEC.\n",count); } } /* timer interrupt service routine (interrupt number 8) */ void interrupt timer() { count++; /* chain to the MS-DOS timer handler approx. 18 times per second */ if (++ticks == MS_PER_TICK) { old_handler(); ticks = 0; } /* issue end-of-interrupt command to 8259 PIC chip */ outportb(0x20, 0x20); }