/************************* * * test program to verify timing interferences * between concurrent routines * coexistence of short and frequent with long and non-preemptive ones * * STR Lab * Luis Almeida, 2003/09/29 * * Changelog * -2006/09/17, PP * Update on port address (from ox2100 to 0xFD00) due to kit firmware update * *****************************/ #include #include "det188.h" #pragma inline #define tmr2_cntl_value 0xe001 /* timer 2 enabled, generate int, run cont */ #define tmr2_maxc_value 1250 /* clock counts per ms */ /* remember that CPU internal clock = 5MHz */ #define tmr_cntl_value 0 /* unmasked, highest priority=0 */ #define mask_value 0x00fd /* all ints masked */ /* [PP] Note: due to firmware update in 2004, port address changed from 0x2100 to 0xfd00 */ /* Default PBA=0xFC00, chip select from PCS2 */ #define p_port_add 0xfd00 /* address of parallel port in the I/O card */ void interrupt t2_isr(void); void heavy_load(void); unsigned int count; void main(void) { unsigned long far *int_vect_pointer; int i; unsigned char TIME_SLICE, leds, leds_done, nsec; /* force interrupts off */ disable(); count=0; /* timer2 count (ms) */ TIME_SLICE=1; /* set timer2 interrupt vector (at 4*tmr2_int_numb) to tick_handler */ int_vect_pointer=(unsigned long far*)MK_FP(0,4*tmr2_int_numb); *(int_vect_pointer)=(unsigned long)t2_isr; /*** program timer2 to generate ints at apropriate rate (TIME_SLICE ms) ***/ outport(tmr2_cntl_reg,tmr2_cntl_value); outport(tmr2_maxc_reg,tmr2_maxc_value*TIME_SLICE); /**** program PIC ****/ /* all ints masked */ outport(mask_reg,mask_value); /* unmask timer, priority=0 highest */ outport(tmr_cntl_reg,tmr_cntl_value); leds=0xaa; outportb(p_port_add,leds); for(i=0;i<10000;i++); leds^=0xff; outportb(p_port_add,leds); for(i=0;i<10000;i++); leds^=0xff; outportb(p_port_add,leds); for(i=0;i<10000;i++); leds^=0xff; outportb(p_port_add,leds); leds_done=0; /* interrupts on */ enable(); while(1) /* { while(count<256); leds^=0xff; outportb(p_port_add,leds); count=0; } */ { /* every 128ms, toggle leds */ nsec=(unsigned char) (count/128); if(count==(unsigned int)(nsec*128)) { if (leds_done==0) { leds^=0xff; outportb(p_port_add,leds); leds_done=1; } } else /* allow following toggles */ leds_done=0; /* every 5s */ if(count>5000) { /* reset counter and invoke heavy non-preemptive load (ints disabled) */ count=0; /*heavy_load();*/ } } } void interrupt t2_isr() { count++; outport(eoi_reg,timers_eoi); } void heavy_load() { unsigned int i,j; disable(); for(i=0;i<32000;i++) for(j=0;j<10;j++); enable(); }