/*
    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 .
*/
/**
 * @page architecture Architecture
 * @brief ChibiOS/RT General Architecture
 * - @ref components
 * - @ref dependencies
 * - @ref kernel_arch
 * - @ref hal_arch
 * .
 * @section components Components
 * ChibiOS/RT is composed of several major components, each component can be
 * composed of one of more subsystems. The main components are:
 * - Kernel, this is the platform independent part of the OS kernel.
 * - HAL, this component contains a set of abstract device drivers
 *   that offer a common I/O API to the application across all the support
 *   platforms. The HAL code is totally portable across platforms.
 * - Port, this is the platform dependent part of the OS kernel. This
 *   component is responsible of the system startup, interrupts abstraction,
 *   lock/unlock primitives, context switch related structures and code.
 *   The component usually contains very little code because the OS is very
 *   portable but the quality of the implementation of the Port component
 *   affects heavily the performance of the ported OS. It is probably the
 *   most critical part of the whole OS.
 * - Platform, this component contains a set of device drivers
 *   implementations.
 * - Various, a library of various extra components that do not belong
 *   to any particular component but can make life easier while developing an
 *   embedded application.
 * .
 * @section dependencies Dependencies
 * The following diagram shows the relationships among the various components
 * that compose the system:
 * @dot
  digraph example {
    node [shape=rectangle, fontname=Helvetica, fontsize=8,
          fixedsize="true", width="1.0", height="0.25"];
    edge [fontname=Helvetica, fontsize=8];
    Application [label="Application"];
    HAL [label="HAL"];
    Platform [label="Platform"];
    Kernel [label="Kernel"];
    Port [label="Port"];
    Board [label="Board Setup"];
    HW [label="Hardware", style="filled", width="3.0", height="0.3"];
    Application -> Kernel;
    Application -> HAL;
    Application -> HW [label=" (not recommended)"];
    HAL -> Platform;
    HAL -> Kernel;
    Board -> HW;
    Platform -> Kernel;
    Platform -> Board;
    Platform -> HW;
    Kernel -> Port;
    Port -> Board [label="Optional", style="dotted"];
    Port -> HW;
  }
 * @enddot
 *
 * @section kernel_arch Kernel Architecture
 * The kernel itself is very modular and is composed of several subsystems,
 * most subsystems are optional and can be switched of in the kernel
 * configuration file @p chconf.h.
 * The current kernel subsystems are divided in five categories:
 * - @ref base, this category contains the mandatory kernel
 *   subsystems:
 *   - @ref system, low level locks, initialization.
 *   - @ref time, virtual timers and time APIs.
 *   - @ref scheduler, scheduler APIs, all the higher level synchronization
 *     mechanism are implemented through this subsystem, it is very flexible
 *     but not recommended for direct use in user code.
 *   - @ref threads, thread-related APIs.
 *   .
 *   Base services diagram:
 * @dot
  digraph example {
    node [shape=rectangle, fontname=Helvetica, fontsize=8,
          fixedsize="true", width="1.0", height="0.25"];
    edge [fontname=Helvetica, fontsize=8];
    Threads -> Scheduler;
    Scheduler-> System;
    Scheduler-> Timers;
    System-> Timers;
  }
 * @enddot
 * - @ref synchronization, this category contains the synchronization-related
 *   subsystems, each one of the provided mechanism can be configured out of
 *   the kernel if not needed.
 *   - @ref semaphores, counter semaphores subsystem.
 *   - @ref mutexes, mutexes subsystem with support to the priority inheritance
 *     algorithm (fully implemented, any depht).
 *   - @ref condvars, condition variables, together with mutexes the condition
 *     variables allow the implementation of monitor constructs.
 *   - @ref events, event sources and event flags with flexible support for
 *     and/or conditions and automatic dispatching to handler functions.
 *   - @ref messages, lightweight synchronous messages.
 *   - @ref mailboxes, asynchronous messages queues.
 *   .
 *   All the synchronization mechanisms are built on top of the Scheduler APIs
 *   except Mailboxes that are build on top of Semaphores and Condition
 *   Variables that implicitly refer to Mutexes:
 * @dot
  digraph example {
    node [shape=rectangle, fontname=Helvetica, fontsize=8,
          fixedsize="true", width="1.1", height="0.25"];
    edge [fontname=Helvetica, fontsize=8];
    Semaphores -> Scheduler;
    Mutexes -> Scheduler;
    Condvars -> Scheduler;
    Condvars -> Mutexes;
    Events -> Scheduler;
    Messages -> Scheduler;
    "Binary Semaphores" -> Semaphores;
    Mailboxes -> Semaphores;
  }
 * @enddot
 * - @ref memory, memory management, multiple non-alternative schemes are
 *   available:
 *   - @ref memcore, centralized core memory manager, this subsystems is used
 *     by the other allocators in order to get chunks of memory in a consistent
 *     way.
 *   - @ref heaps, central heap manager using a first fit strategy, it also
 *     allow the creation of multiple heaps in order to handle non uniform
 *     memory areas.
 *   - @ref pools, very fast fixed size objects allocator.
 *   - @ref threads (dynamic), usually threads are static objects in ChibiOS/RT
 *     but there is the option for dynamic threads management, please see the
 *     article @ref article_lifecycle.
 *   .
 *   The various allocators follow a precise hierarchy:
 * @dot
  digraph example {
    node [shape=rectangle, fontname=Helvetica, fontsize=8,
          fixedsize="true", width="1.0", height="0.25"];
    edge [fontname=Helvetica, fontsize=8];
    Application [label="Application", width="2.0"];
    RAM [label="RAM", style="filled", width="2.0"];
    Core [label="Core Allocator"];
    Dynamic [label="Dynamic Threads"];
    Heaps [label="Dynamic Heaps"];
    Pools [label="Memory Pools"];
    C [label="C-runtime"];
    Application -> Dynamic;
    Application -> Heaps;
    Application -> Pools;
    Application -> C [label="(not recommended)"];
    Application -> Core;
    Dynamic -> Heaps;
    Dynamic -> Pools;
    Heaps -> Core;
    Pools -> Core;
    C -> Core;
    Core -> RAM
  }
 * @enddot
 *   Please also see the article @ref article_manage_memory.
 * - @ref io_support, the kernel also provides mechanisms and abstract data
 *   interfaces that can be used by non-kernel components, the HAL as example.
 *   - @ref data_streams, abstract streams interface.
 *   - @ref io_channels, abstract I/O channels that inherits from the abstract
 *     stream interface.
 *   - @ref io_queues, generic, byte wide, I/O queues APIs.
 *   .
 * - @ref debug, debug services and APIs. The @ref registry susystem can be
 *   seen as part of the debug category even if it finds use in non-debug
 *   roles.
 * .
 * @section hal_arch HAL Architecture
 * The HAL is a collection of abstract device drivers, it relies on the
 * Platform component for the low level implementation on specific
 * hardware.
 * The current internal HAL organization is the following:
 * @dot
  digraph example {
    rankdir="LR";
    node [shape=rectangle, fontname=Helvetica, fontsize=8,
          fixedsize="true", width="1.0", height="0.25"];
    edge [fontname=Helvetica, fontsize=8];
    subgraph cluster_HAL {
      node [shape=rectangle, fontname=Helvetica, fontsize=8,
            fixedsize="true", width="0.6", height="0.25"];
      ADC [label="ADC"];
      CAN [label="CAN"];
      HAL [label="HAL"];
      MAC [label="MAC"];
      PAL [label="PAL"];
      PWM [label="PWM"];
      SER [label="SER"];
      SPI [label="SPI"];
      MMC_SD [label="MMC/SD"];
      color = blue;
      label = "HAL";
    }
    subgraph cluster_Platform {
      node [shape=rectangle, fontname=Helvetica, fontsize=8,
            fixedsize="true", width="0.6", height="0.25"];
      ADC_LLD [label="ADC_LLD"];
      CAN_LLD [label="CAN_LLD"];
      HAL_LLD [label="HAL_LLD"];
      MAC_LLD [label="MAC_LLD"];
      PAL_LLD [label="PAL_LLD"];
      PWM_LLD [label="PWM_LLD"];
      SER_LLD [label="SER_LLD"];
      SPI_LLD [label="SPI_LLD"];
      color = blue;
      label = "Platform";
    }
    node [shape=rectangle, fontname=Helvetica, fontsize=8,
          fixedsize="true", width="1", height="0.5"];
    edge [fontname=Helvetica, fontsize=8];
    Application [label="Application"];
    HW [label="Hardware", style="filled"];
    ADC -> ADC_LLD;
    CAN -> CAN_LLD;
    HAL -> HAL_LLD;
    MAC -> MAC_LLD;
    PAL -> PAL_LLD;
    PWM -> PWM_LLD;
    SER -> SER_LLD;
    SPI -> SPI_LLD;
    MMC_SD -> SPI [constraint=false];
    Application -> ADC;
    Application -> CAN;
    Application -> HAL;
    Application -> MAC;
    Application -> PAL;
    Application -> PWM;
    Application -> SER;
    Application -> SPI;
    Application -> MMC_SD;
    ADC_LLD -> HW;
    CAN_LLD -> HW;
    HAL_LLD -> HW;
    MAC_LLD -> HW;
    PAL_LLD -> HW;
    PWM_LLD -> HW;
    SER_LLD -> HW;
    SPI_LLD -> HW;
  }
 * @enddot
 * 
 * See @ref IO for details about the various HAL subsystems.
 */