/*
    ChibiOS/RT - Copyright (C) 2006-2007 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 .
*/
/**
 * @defgroup kernel Kernel
 * The kernel is the portable part of ChibiOS/RT, this section documents the
 * various kernel subsystems.
 */
/**
 * @defgroup kernel_info Version Numbers and Identification
 * Kernel related settings and hooks.
 * @ingroup kernel
 */
/**
 * @defgroup config Configuration
 * Kernel related settings and hooks.
 * @ingroup kernel
 */
/**
 * @defgroup types Types
 * System types and macros.
 * @ingroup kernel
 */
/**
 * @defgroup base Base Kernel Services
 * Base kernel services, the base subsystems are always included in the
 * OS builds.
 * @ingroup kernel
 */
/**
 * @defgroup system System Management
 * Initialization, Locks, Interrupt Handling, Power Management, Abnormal
 * Termination.
 * @ingroup base
 */
/**
 * @defgroup time Time and Virtual Timers
 * Time and Virtual Timers related APIs.
 * @ingroup base
 */
/**
 * @defgroup scheduler Scheduler
 * ChibiOS/RT scheduler APIs and macros.
 * @ingroup base
 */
/**
 * @defgroup threads Threads
 * Threads related APIs.
 * @ingroup base
 */
/**
 * @defgroup synchronization Synchronization
 * Synchronization services.
 * @ingroup kernel
 */
/**
 * @defgroup semaphores Semaphores
 * Semaphores and threads synchronization.
 * 
Operation mode
 * A semaphore is a threads synchronization object, some operations
 * are defined on semaphores:
 * - Signal: The semaphore counter is increased and if the result
 *   is non-positive then a waiting thread is removed from the semaphore
 *   queue and made ready for execution.
 * - Wait: The semaphore counter is decreased and if the result
 *   becomes negative the thread is queued in the semaphore and suspended.
 * - Reset: The semaphore counter is reset to a non-negative value
 *   and all the threads in the queue are released.
 * .
 * Semaphores can be used as guards for mutual exclusion code zones (note that
 * mutexes are recommended for this kind of use) but also have other uses,
 * queues guards and counters as example.
 * Semaphores usually use FIFO queues but it is possible to make them
 * order threads by priority by specifying CH_USE_SEMAPHORES_PRIORITY in
 * @p chconf.h.
 * In order to use the Semaphores APIs the @p CH_USE_SEMAPHORES
 * option must be specified in @p chconf.h.
 * @ingroup synchronization
 */
/**
 * @defgroup mutexes Mutexes
 * Mutexes and threads synchronization.
 * Operation mode
 * A mutex is a threads synchronization object, some operations are defined
 * on mutexes:
 * - Lock: The mutex is checked, if the mutex is not owned by some
 *   other thread then it is locked else the current thread is queued on the
 *   mutex in a list ordered by priority.
 * - Unlock: The mutex is released by the owner and the highest
 *   priority thread waiting in the queue, if any, is resumed and made owner
 *   of the mutex.
 * .
 * In order to use the Event APIs the @p CH_USE_MUTEXES option must be
 * specified in @p chconf.h.
 *
 * Constraints
 * In ChibiOS/RT the Unlock operations are always performed in Lock-reverse
 * order. The Unlock API does not even have a parameter, the mutex to unlock
 * is taken from an internal stack of owned mutexes.
 * This both improves the performance and is required by an efficient
 * implementation of the priority inheritance mechanism.
 *
 * The priority inversion problem
 * The mutexes in ChibiOS/RT implements the full priority
 * inheritance mechanism in order handle the priority inversion problem.
 * When a thread is queued on a mutex, any thread, directly or indirectly,
 * holding the mutex gains the same priority of the waiting thread (if their
 * priority was not already equal or higher). The mechanism works with any
 * number of nested mutexes and any number of involved threads. The algorithm
 * complexity (worst case) is N with N equal to the number of nested mutexes.
 * @ingroup synchronization
 */
/**
 * @defgroup condvars Condition Variables
 * Condition Variables and threads synchronization.
 * Operation mode
 * The condition variable is a synchronization object meant to be used inside
 * a zone protected by a @p Mutex. Mutexes and CondVars together can implement
 * a Monitor construct.
 * In order to use the Condition Variables APIs the @p CH_USE_CONDVARS
 * option must be specified in @p chconf.h.
 * @ingroup synchronization
 */
/**
 * @defgroup events Event Flags
 * @brief Event Flags, Event Sources and Event Listeners.
 * Operation mode
 * Each thread has a mask of pending event flags inside its Thread structure.
 * Several operations are defined:
 * - Wait, the invoking thread goes to sleep until a certain AND/OR
 *   combination of event flags becomes pending.
 * - Clear, a mask of event flags is cleared from the pending events
 *   mask, the cleared event flags mask is returned (only the flags that were
     actually pending and then cleared).
 * - Signal, an event mask is directly ORed to the mask of the signaled
 *   thread.
 * - Broadcast, each thread registered on an Event Source is signaled
 *   with the event flags specified in its Event Listener.
 * - Dispatch, an events mask is scanned and for each bit set to one
 *   an associated handler function is invoked. Bit masks are scanned from bit
 *   zero upward.
 * .
 * An Event Source is a special object that can be "broadcasted" by a thread or
 * an interrupt service routine. Broadcasting an Event Source has the effect
 * that all the threads registered on the Event Source will be signaled with
 * and events mask.
 * An unlimited number of Event Sources can exists in a system and each
 * thread can listen on an unlimited number of them.
 * In order to use the Event APIs the @p CH_USE_EVENTS option must be
 * specified in @p chconf.h.
 * @ingroup synchronization
 */
/**
 * @defgroup messages Synchronous Messages
 * Synchronous inter-thread messages.
 * Operation Mode
 * Synchronous messages are an easy to use and fast IPC mechanism, threads
 * can both serve messages and send messages to other threads, the mechanism
 * allows data to be carried in both directions. Data is not copied between
 * the client and server threads but just a pointer passed so the exchange
 * is very time efficient.
 * Messages are usually processed in FIFO order but it is possible to process
 * them in priority order by specifying CH_USE_MESSAGES_PRIORITY
 * in @p chconf.h.
 * Threads do not need to allocate space for message queues, the mechanism
 * just requires two extra pointers in the @p Thread structure (the message
 * queue header).
 * In order to use the Messages APIs the @p CH_USE_MESSAGES option must be
 * specified in @p chconf.h.
 * @ingroup synchronization
 */
/**
 * @defgroup mailboxes Mailboxes
 * Asynchronous messages.
 * Operation mode
 * A mailbox is an asynchronous communication mechanism.
 * The following operations are possible on a mailbox:
 * - Post: Posts a message on the mailbox in FIFO order.
 * - Post Ahead: Posts a message on the mailbox with high priority.
 * - Fetch: A message is fetched from the mailbox and removed from
 *   the queue.
 * - Reset: The mailbox is emptied and all the stored messages lost.
 * .
 * A message is a variable of type msg_t that is guaranteed to have the
 * same size of and be compatible with pointers (an explicit cast is needed).
 * If larger messages need to be exchanged then a pointer to a structure can
 * be posted in the mailbox but the posting side has no predefined way to
 * know when the message has been processed. A possible approach is to
 * allocate memory (from a memory pool as example) from the posting side and
 * free it on the fetching side. Another approach is to set a "done" flag into
 * the structure pointed by the message.
 * @ingroup synchronization
 */
/**
 * @defgroup memory Memory Management
 * Memory Management services.
 * @ingroup kernel
 */
/**
 * @defgroup memcore Core Memory Manager
 * Core Memory Manager related APIs.
 * Operation mode
 * The core memory manager is a simplified allocator that only allows to
 * allocate memory blocks without the possibility to free them.
 * This allocator is meant as a memory blocks provider for the other
 * allocators such as:
 * - C-Runtime allocator.
 * - Heap allocator (see @ref heaps).
 * - Memory pools allocator (see @ref pools).
 * .
 * By having a centralized memory provider the various allocators can coexist
 * and share the main memory.
 * This allocator, alone, is also useful for very simple applications that
 * just require a simple way to get memory blocks.
 * In order to use the core memory manager APIs the @p CH_USE_MEMCORE option
 * must be specified in @p chconf.h.
 * @ingroup memory
 */
/**
 * @defgroup heaps Heaps
 * Heap Allocator related APIs.
 * Operation mode
 * The heap allocator implements a first-fit strategy and its APIs are
 * functionally equivalent to the usual @p malloc() and @p free(). The main
 * difference is that the heap APIs are thread safe.
 * By enabling the @p CH_USE_MALLOC_HEAP option the heap manager will use the
 * runtime-provided @p malloc() and @p free() as backend for the heap APIs
 * instead of the system provided allocator.
 * In order to use the heap APIs the @p CH_USE_HEAP option must be specified
 * in @p chconf.h.
 * @ingroup memory
 */
/**
 * @defgroup pools Memory Pools
 * Memory Pools related APIs.
 * Operation mode
 * The Memory Pools APIs allow to allocate/free fixed size objects in
 * constant time and reliably without memory fragmentation problems.
 * In order to use the Time APIs the @p CH_USE_MEMPOOLS option must be
 * specified in @p chconf.h.
 * @ingroup memory
 */
 /**
 * @defgroup io_support I/O Support
 * I/O related services.
 * @ingroup kernel
 */
/**
 * @defgroup io_channels I/O Abstract Channels
 * @brief Abstract I/O Channels.
 * @details This module defines an abstract interface for I/O channels. Note
 * that no code is present, I/O channels are just abstract classes-like
 * structures, you should look at the systems as to a set of abstract C++
 * classes (even if written in C). Specific device drivers can use/extend
 * the interfaces and implement them.
 * This system has the advantage to make the access to channels
 * independent from the implementation logic. As example, an I/O channel
 * interface can hide the access to a serial driver, to a networking socket
 * and so on.
 *
 * @ingroup io_support
 */
 
/**
 * @defgroup io_queues I/O Queues
 * @brief I/O queues.
 * @details ChibiOS/RT supports several kinds of queues. The queues are mostly
 * used in serial-like device drivers. The device drivers are usually designed
 * to have a lower side (lower driver, it is usually an interrupt service
 * routine) and an upper side (upper driver, accessed by the application
 * threads).
 * There are several kind of queues:
 * - Input queue, unidirectional queue where the writer is the
 *   lower side and the reader is the upper side.
 * - Output queue, unidirectional queue where the writer is the
 *   upper side and the reader is the lower side.
 * - Full duplex queue, bidirectional queue where read and write
 *   operations can happen at the same time. Full duplex queues
 *   are implemented by pairing an input queue and an output queue together.
 * .
 * In order to use the I/O queues the @p CH_USE_QUEUES option must
 * be specified in @p chconf.h.
 *
 * @ingroup io_support
 */
/**
 * @defgroup debug Debug
 * Debug APIs and procedures.
 * @ingroup kernel
 */
/**
 * @defgroup core Port Templates
 * Non portable code templates.
 * @ingroup kernel
 */
/**
 * @defgroup internals Internals
 * Internal details, not APIs.
 * @ingroup kernel
 */