Detaching an interrupt handler
When done with the ISR, we may wish to break the association between the ISR and the interrupt vector:
int
InterruptDetach (int id);
I said may
because
threads that handle interrupts are generally found in servers, and servers
generally hang around forever.
It's therefore conceivable that a well-constructed server wouldn't ever
issue the
InterruptDetach()
function call.
Also, the OS will remove any interrupt handlers that a thread or process
may have associated with it when the thread or process dies.
So, simply falling off the end of
main(),
calling
exit(),
or exiting due to a SIGSEGV, will dissociate your ISR from the interrupt vector, automagically.
(Of course, you'll probably want to handle this a little better, and stop
your device from generating interrupts. If another device is sharing the interrupt, then
there are no two ways about it—you must clean up, otherwise you won't get
any more interrupts if running in edge-sensitive mode, or you'll get a constant flood of ISR dispatches
if running in level-sensitive mode.)
Continuing the above example, if we want to detach, we'd use the following code:
void
terminateInterrupts (void)
{
InterruptDetach (interruptID);
}
If this was the last ISR associated with that interrupt vector, the kernel would automatically mask the interrupt source at the PIC level so that it doesn't generate interrupts.
