/*
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"];
HW [label="Hardware", style="filled", width="3.0", height="0.3"];
Application -> Kernel;
Application -> HAL;
Application -> HW [label=" (not recommended)"];
HAL -> Platform;
HAL -> Kernel;
Platform -> Kernel;
Platform -> HW;
Kernel -> Port;
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.0", height="0.25"];
edge [fontname=Helvetica, fontsize=8];
Semaphores -> Scheduler;
Mutexes -> Scheduler;
Condvars -> Scheduler;
Condvars -> Mutexes;
Events -> Scheduler;
Messages -> Scheduler;
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];
Core [label="Core Allocator"];
Dynamic [label="Dynamic Threads"];
Heaps [label="Dynamic Heaps"];
Pools [label="Memory Pools"];
C [label="C-runtime"];
Dynamic -> Heaps;
Dynamic -> Pools;
Heaps -> Core;
Pools -> Core;
C -> Core;
}
* @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.
*/