ChibiOS RT and NIL offer a cross-platform method for writing interrupt handlers. Port-related and compiler-related details are encapsulated within standard system macros.
ChibiOS abstracts interrupt sources in two classes:
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(vector_name) { 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(); }
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(vector_name) { /* Fast IRQ handling code, 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.*/ }
A note about the handler name vector_name
, 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. For example, for Cortex-M a vector name is under the form VectorXX
where XX is the byte offset (uppercase hexadecimal) of the vector from the vectors table base, example VectorBC
.