Mail Archives: djgpp/2000/12/14/05:50:37
On Wed, 13 Dec 2000, bob wrote:
> void dos_ISRTimer()
> {
> enable();
> (*dos_callbackTimer)();//call to the main processing routine
> enable();
> outportb(0x20,0x20);//eoi
> outportb(0xa0,0x20);//eoei
> }
The EOI commands above are in the wrong order: you need to EOI the
slave PIC _before_ the master, not after it.
Also, you want to lose those enable() calls: they are not needed, and
they slow down your handler; in some environments the slow-down will
be tremendous.
> _go32_dpmi_set_protected_mode_interrupt_vector
> (dos_M_VectTimer,&infoMyISRTimer);
What is the value of dos_M_VectTimer?
> I find that dos_ISRTimer never called, when run a test program.
Probably because IRQ 10 is disabled by default. This is accomplished
by sending the command 0x4 to the port 0xa1. You didn't do that.
> So, I re-program the 8259s on the pc board as follows,
> /*-------------------------*/
> outportb(0x20,0x11);
> outportb(0x21,0x8);//modi CW2 register of primary 8259
> outportb(0x21,0x4);
> outportb(0x21,0x1);
> outportb(0xa0,0x11);
> outportb(0xa1,0x70);
> outportb(0xa1,0x2);
> outportb(0xa1,0x1);
> outportb(0x21,0);
> outportb(0xa1,0);
I don't why did you need to send all this to the 8259. There are lots
of commands here, some of which cause the PIC to reinitialize itself
for no good reason. You also didn't disable interrupts while
initializing the PIC, and didn't restore the original interrupt mask
after all these commands.
Basically, most of this stuff is not needed at all. Just enable IRQ10
as shown above, all the rest should already be set up for you.
> this time my ISR called three times and then it said:
> "Double Fault at eip=........error=0000"
> and the program aborted.
Probably because some of the outportb commands above switched the PIC
to a dangerous state.
- Raw text -