How to write interrupt handlers

Since version 1.1.0 ChibiOS/RT offers a cross-platform method for writing interrupt handlers. Port-related and compiler-related details are encapsulated within standard system macros.

Writing Regular Interrupt handlers

A Regular Interrupts handler is an ISR from where the invocation of system APIs is possible, it must be written using the following general form:

CH_IRQ_HANDLER(myIRQ) {
  CH_IRQ_PROLOGUE();
 
  /* IRQ handling code, preemptable if the architecture supports it.*/
 
  chSysLockFromISR();
  /* Invocation of some I-Class system APIs, never preemptable.*/
  chSysUnlockFromISR();
 
  /* More IRQ handling code, again preemptable.*/
 
  CH_IRQ_EPILOGUE();
}

Writing Fast Interrupt handlers

On some architectures it is supported a special class of “Fast Interrupts”, such interrupt sources have a higher hardware priority than the kernel so it is not possible to invoke system APIs from there. Fast interrupts handlers must be written using the following general form:

CH_FAST_IRQ_HANDLER(myIRQ) {
 
  /* Fast IRQ handling code, preemptable if the architecture supports it.
     The invocation of any API is forbidden here because fast interrupt
     handlers can preempt the kernel even within its critical zones in
     order to minimize latency.*/
}

Handlers naming

A note about the handler name “myIRQ”, in some ports it must be a vector number rather than a function name, it could also be a name from within a predefined set, see the notes about the various ports.

More articles and guides are available on the technical wiki.

learn more

Need Tutorials?

Try the video tutorials and guides on Play Embedded.

learn more

Need Support?

The forums is the best place, registration required.

learn more