Interrupt Dispatcher

This is a list of the major differences between EKA1 and EKA2:

  • In EKA1, the generic kernel provided the code for binding and unbinding interrupts, and for maintaining a table of ISRs in the generic kernel. This was done through functions in the TInterrupt class, which no longer exists in EKA2.

    In EKA2, this is all implemented in the port

  • In EKA1, is was possible to bind multiple interrupt service routines to a single interrupt source through a call to the TInterrupt::Bind() function and specifying the appropriate value of TBindBehaviour.

    In EKA2, only one ISR per interrupt source is permitted.

  • In EKA1, ISRs were implementations of the TInterrupt::Service() function, defined as pure virtual in TInterrupt.

    In EKA2, an ISR is a bare function, not a class member. The functions for enabling, disabling and clearing interrupts are now defined in a single, static, class called Interrupt. Symbian platform defines this class, but does not provide a default implementation; instead, the port must provide an implementation, and this is invariably in the ASSP layer.

  • In EKA1, interrupts were identified by a text string defined in the ASSP layer and had to be translated by the layer into a vector number that indexed into the interrupt vector table.

    In EKA2, interrupts are now identified by a simple TInt value defined by the port.

  • In EKA1, it was difficult to implement support for chained, pseudo or external variant interrupts.

    In EKA2, it is much easier because you can bind an ISR that is itself a dispatcher.

  • IN EKA1, there was no clear policy for dealing with spurious interrupts. Any spurious interrupt would be consumed and an attempt made to disable it in hardware.

    In EKA2, all interrupt sources are, by default, bound to the spurious interrupts handler, which is intended to raise a panic so that spurious interrupts are not overlooked during testing.