Date: Thu, 14 Dec 2000 11:43:12 +0200 (IST) From: Eli Zaretskii X-Sender: eliz AT is To: bob cc: djgpp AT delorie DOT com Subject: Re: Re: my interrupt routine not called any more. In-Reply-To: <20001213093230.672FF1D3FE033@bjapp2.163.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Reply-To: djgpp AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk 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.