ROsman%ASS%SwRI05@D26VS046A.CCF.SWRI.EDU (06/20/91)
I have a few problems that are nagging me, and I'm looking for ideas. I have a device that generates an interrupt every 300 +/- 5 milliseconds. Okay, here's the code in question: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ =+=+=+= void (_interrupt _far tite_handler (void)) { /* Cycle the board through mode 3 to clear the pending in- terrupt I should use card_off() here, but fear of stack check- ing... */ access = inpw(ACCESS_REGISTER); command_word = inpw (COMM_DATA_RAM); outpw (CARD_CONFIG, 0x0310 ); _disable(); /* and clear the Peripheral Interrupt Controller */ if (pic_addr > LO_PIC_ADDR) { outp ( LO_PIC_ADDR , END_OF_INTERRUPT ); } outp ( PIC_EOI , END_OF_INTERRUPT ); _enable(); /* access_flag indicates the number of unserviced interrupts. The interrupt service routine zeros it after service is complete. */ access_flag++; } +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= I have two possibly related problems. First, the output of this routine is checked in a do forever type loop that checks "access_flag". I'm doing this so I can safely use library routines like printf. When I print "access_flag" from this loop, it's value is ALWAYS 2. Interrupts from the card being serviced are re-enabled at the end of the servicing code just after the statement: access_flag = 0; Second, when I use interrupt lines associated with PIC1 (irqs 5 and 7), the thing hangs without an interrupt occuring after five or so interrupts. If I use interrupt lines associated with PIC2 (irqs 10, 11, 12 and 14) the thing runs for thousands of cycles (10,000 so far) without a hitch. Watching the hardware with a 'scope indicates that the response time is no more than 50 microseconds, and is usually less than 20. The interrupt line transitions are clean and I see an edge ONLY once every every 300 +/- 5 milliseconds. The machine is 25 MHz EISA 486. Thanks in advance for any help, Rich Osman Please reply to >INTERNET:Oz@SwRI.edu