"Jim Leonard" <spamtrap@[EMAIL PROTECTED]
> wrote in message
news:1183655242.640201.198510@[EMAIL PROTECTED]
> However, I'm not sure an "in ISR" flag is necessary -- The interrupt
> in question is a hardware interrupt. Since it's a hardware interrupt,
> isn't another hardware interrupt for the SAME IRQ not possible until I
> issue the EOI to the PIC?
Correct, but IRQ priorities on an IBM PC have been assigned somewhat
arbitarily, so it's a good idea IMO to issue an EOI and execute an STI
early
in your ISR. This will allow all other interrupts to occur, and not just
the
ones that have a higher PIC priority. This also of course also allows your
ISR to re-enter itself, but you can avoid disaster with a counting
semaphore. Depending on what exactly your ISR does, you might want to do
something like the following:
procedure MyISR(var Regs: Registers); assembler;
const
InISR: Integer = 0;
asm
inc [InISR]
sti { Allow higher priority interrupts }
cmp [InISR],1
out [$20],$20 { EOI - Allow all interrupts, incl. this one }
jne @[EMAIL PROTECTED]
{ ISR is re-entered, so exit with InISR + 1, EOI & STI
}
push ax
push bx
push ...etc
push ds
mov ax,Seg @[EMAIL PROTECTED]
push es
mov ds,ax
@[EMAIL PROTECTED]
call DoISROperation
lock; dec [InISR]
jnz @[EMAIL PROTECTED]
{ Repeat for every re-entry }
pop es
pop ds
pop ...etc
pop bx
pop ax
@[EMAIL PROTECTED]
rti
end;
The above (written off the top of my head) has two advantages:
(1) It doesn't block any other ISR's, even lower priority ones such as the
IRQ5 which you say your hard drive is using.
(2) It allows re-entrancy without causing any damage and without missing
any
"DoISROperation"s. The jitter might be bad, but often this either doesn't
matter, or bad jitter is much better than completely missing an ISR
operation altogether.
The above assumes that the hardware in question will generate another IRQ
without you reading or writing any of its registers. If it doesn't then
the
semaphore isn't needed, or you need to re-enable its IRQ firing mechanism
even when it's just a re-entry.


|