From: Laurentiu Badea Newsgroups: comp.os.msdos.djgpp Subject: DJGPP gurus: interrupts wrappers are reentrant ? Date: Sun, 16 Mar 1997 10:22:05 +0200 Organization: Numerical Methods Laboratory Lines: 84 Message-ID: <332BADAD.63C7A87E@lmn.pub.ro> NNTP-Posting-Host: heineken.lmn.pub.ro Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------14B331C6E4D5AA8639598AE" To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp This is a multi-part message in MIME format. --------------14B331C6E4D5AA8639598AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit I have a problem which those of you who are more experienced in low-level stuff with DJGPP may know the answer: My interrupt handler is designed to be "reentrant" (if another interrupt arrives while the current one is still served, then my handler just counts it), as in the attached simple program. Then why it hangs or keeps reporting 0 "lost irqs", at best ? What am I missing, and how to make it work ? Note: the number used for the wait loop in the main prog takes few seconds on a P100. The other is 100 times smaller, still high enough to keep the loop more than 55ms. Please help me, I'm stuck. Laurentiu Badea PS. Please email, as I don't get to read the news too often. -- --------------------------------------------------------------------- | Laurentiu Badea, byte AT lmn DOT pub DOT ro | | student at PUB, | | Computer Science Dept. http://www2.lmn.pub.ro/~byte/ | --------------------------------------------------------------------- --------------14B331C6E4D5AA8639598AE Content-Type: text/plain; charset=us-ascii; name="timer.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="timer.c" #include _go32_dpmi_seginfo go32info; unsigned timer_ticks = 0; unsigned timer_irqs_lost = 0; int in_main_timer = 0; void main_timer( void ){ int i; disable(); /* interrupts should be have been disabled on entry anyways */ if ( !in_main_timer++ ){ ++timer_ticks; outb( 0x20, 0x20 ); enable(); /* spend some time around... so that the next irq will arrive while we're still here */ for ( i = 0; i < 1000000; i++ ); in_main_timer = 0; } else { ++timer_irqs_lost; ++timer_ticks; outb( 0x20, 0x20 ); enable(); } } void main( int argc, char **argv ){ _go32_dpmi_seginfo info; int i; info.pm_offset = (unsigned) main_timer; info.pm_selector = _my_cs(); _go32_dpmi_allocate_iret_wrapper( &info ); _go32_dpmi_get_protected_mode_interrupt_vector( 8, &go32info ); _go32_dpmi_set_protected_mode_interrupt_vector( 8, &info ); /* can't use sleep() because it's based on irq 0 */ for ( i = 0; i < 100000000; i++ ); printf( "Total irqs: %lu, lost: %lu\n", timer_ticks, timer_irqs_lost ); _go32_dpmi_get_protected_mode_interrupt_vector( 8, &info ); _go32_dpmi_set_protected_mode_interrupt_vector( 8, &go32info ); _go32_dpmi_free_iret_wrapper( &info ); } --------------14B331C6E4D5AA8639598AE--