/*
    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.

    This file is part of ChibiOS/RT.

    ChibiOS/RT is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS/RT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @page article_interrupts 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.
 *
 * <h2>Writing Regular Interrupt handlers</h2>
 * A Regular Interrupts handler (see @ref interrupt_classes) must be written
 * using the following general form:
 * @code
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();
}
 * @endcode
 *
 * <h2>Writing Fast Interrupt handlers</h2>
 * In those architectures (@ref ARM7 and @ref ARMCMx) supporting Fast
 * Interrupts (see @ref interrupt_classes) handlers must be written
 * using the following general form:
 * @code
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.
}
 * @endcode
 *
 * <h2>Handlers naming</h2>
 * 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.
 *
 * <h2>Important Notes</h2>
 * - There is an important application note about ARM7 interrupt handlers,
 *   please read about it in the ARM7 port section: @ref ARM7_IH
 * .
 */