/* 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 . */ /** * @mainpage ChibiOS/RT * @author Giovanni Di Sirio (gdisirio@users.sourceforge.net). * *

Chibi ?

* I didn't want a serious name for this project. It is the Japanese word for * small as in small child. So ChibiOS/RT * @htmlonly (ちびOS/RT) @endhtmlonly * means small Real Time Operating System. * Source Wikipedia. * *

Features

* - Free software, GPL3 licensed. Stable releases include a exception clause * to the GPL. * - Designed for realtime applications. * - Easily portable. * - Preemptive scheduling. * - 128 priority levels. Multiple threads at the same priority level allowed. * - Round robin scheduling for threads at the same priority level. * - Offers threads, virtual timers, semaphores, mutexes, condvars, * event flags, messages, mailboxes, I/O queues. * - No static setup at compile time, there is no need to configure a maximum * number of all the above objects. * - PC simulator target included, the development can be done on the PC * using MinGW.
* Timers, I/O channels and other HW resources are simulated in a * Win32 process and the application code does not need to be aware of it. * MinGW demo available. * - No *need* for a memory allocator, all the kernel structures are static * and declaratively allocated. * - Optional, thread safe, Heap Allocator subsystem. * - Optional, thread safe, Memory Pools Allocator subsystem. * - Blocking and non blocking I/O channels with timeout and events generation * capability. * - Minimal system requirements: about 8KiB ROM with all options enabled and * speed optimizations on. The size can shrink under 2KiB by disabling the * the unused subsystems and optimizing for size. * - Almost totally written in C with little ASM code required for ports. * . *

Related pages

* - @subpage lic_faq * - @subpage goals * - @subpage concepts * - @subpage articles * - @subpage testsuite * . */ /** * @page testsuite Test Suite *

Description

* Most of the ChibiOS/RT demos link a set of software modules (test suite) in * order to verify the proper working of the kernel, the port and the demo * itself.
* Each Test Module performs a series of tests on a specified subsystem or * subsystems and can report a failure/success status and/or a performance * index as the test suite output.
* The test suite is usually activated in the demo applications by pressing a * button on the target board, see the readme into the various demos * directories. The test suite output is usually sent through a serial port and * can be examined by using a terminal emulator program. * *

Test Modules

* - @subpage test_threads * - @subpage test_dynamic * - @subpage test_msg * - @subpage test_sem * - @subpage test_mtx * - @subpage test_events * - @subpage test_mbox * - @subpage test_queues * - @subpage test_serial * - @subpage test_heap * - @subpage test_pools * - @subpage test_benchmarks * . */ /** * @defgroup Ports Ports * This section describes the technical details for the various supported * ChibiOS/RT ports. */ /** * @defgroup Kernel Kernel * Kernel related subsystems, */ /** * @defgroup Config Configuration * In @p chconf.h are defined the required subsystems for your application. * @ingroup Kernel */ /** * @defgroup Core Port Code Templates * Non portable code templates. The function and the macros defined under this * section are the non portable part of the kernel. * @note The port code is not an API, the applications should not invoke it * directly, use the equivalent system API instead. * @ingroup Kernel */ /** * @defgroup Types Types * System types and macros. * @ingroup Kernel */ /** * @defgroup System System Management * Initialization, Locks, Interrupt Handling, Power Management, Abnormal * Termination. * @ingroup Kernel */ /** * @defgroup Debug Debug Support * Debug APIs and procedures. * @ingroup Kernel */ /** * @defgroup Scheduler Low Level Scheduler * ChibiOS/RT scheduler APIs and macros. * @ingroup Kernel */ /** * @defgroup ThreadLists Thread Lists and Queues * ChibiOS/RT thread lists and queues utilities. * @ingroup Kernel */ /** * @defgroup Threads Threads * Threads related APIs. * @ingroup Kernel */ /** * @defgroup Time Time and Virtual Timers * Time and Virtual Timers related APIs. * @ingroup Kernel */ /** * @defgroup Memory Memory Management * Memory Management services. */ /** * @defgroup Heap Heap * 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 MemoryPools 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 Synchronization Synchronization * Synchronization services. */ /** * @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 IO I/O Support * @brief I/O related services. * @details This section contains the I/O related services. Note that no * specific drivers are documented here, all the listed modules are abstract * interfaces or kernel APIs that the device drivers should implement/use.
* The use of common I/O interfaces allow for a certain degree of portability * for the ChibiOS/RT application among very different MCUs. */ /** * @defgroup IOPorts Abstract I/O Ports * @brief Abstract digital I/O ports. * @details This module defines an abstract interface for digital I/O ports. * Note that no code is present, I/O ports are just a set of macros that must * be implemented by an @ref IOPortsLLD.
* Currently the I/O ports interface does not handle physical port programming * like direction, pull up/down resistors etc. The interface only allows input * and output operations but this may change in future releases. * This system has the advantage to make the access to I/O ports platform * independent from the implementation logic. * *

Implementation Rules

* In implementing an @ref IOPortsLLD there are some rules/behaviors that * should be respected. * *

Writing on input pads

* The behavior is not specified but there are implementations better than * others, this is the list of possible implementations, preferred options * are on top: * -# The written value is not actually output but latched, should the pads * be reprogrammed as outputs the value would be in effect. * -# The write operation is ignored. * -# The write operation has side effects, as example disabling/enabling * pull up/down resistors or changing the pad direction. This scenario is * discouraged, please try to avoid this scenario. * . *

Reading from output pads

* The behavior is not specified but there are implementations better than * others, this is the list of possible implementations, preferred options * are on top: * -# The actual pads states are read (not the output latch). * -# The output latch value is read (regardless of the actual pads states). * -# Unspecified, please try to avoid this scenario. * . *

Writing unused or unimplemented port bits

* The behavior is not specified. * *

Reading from unused or unimplemented port bits

* The behavior is not specified. * *

Reading or writing on pins associated to other functionalities

* The behavior is not specified. * * @ingroup IO */ /** * @defgroup IOPortsLLD I/O Ports Low Level Driver * @brief Digital I/O ports low level driver template. * @details This file is a template for an I/O port low level driver. This * file implements the prysical layer of an I/O port driver. * * @ingroup IOPorts */ /** * @defgroup Channels Abstract I/O 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 */ /** * @defgroup IOQueues 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 */ /** * @defgroup Serial Serial Drivers * @brief Generic Serial Drivers. * @details This module implements a generic full duplex serial driver. The * driver implements a @p FullDuplexDriver interface and uses I/O Queues for * communication between the upper and the lower driver. Event flags are used * to notify the application about incoming data, outgoing data and other I/O * events.
* The module also contains functions that make the implementation of the * interrupt service routines much easier.
* In order to use the serial full duplex driver the * @p CH_USE_SERIAL_FULLDUPLEX option must be specified in @p chconf.h. * * @ingroup IO */ /** * @defgroup utilities_library Utilities Library * @brief Utilities Library. * @details This is a collection of useful library code that is not part of * the base kernel services. *

Notes

* The library code does not follow the same naming convention of the * system APIs in order to make very clear that it is not "core" code.
* The main difference is that library code is not formally tested in the * test suite but through usage in the various demo applications. */ /** * @defgroup CPlusPlusLibrary C++ Wrapper * @brief C++ wrapper module. * @details This module allows to use the ChibiOS/RT functionalities * from C++ as classes and objects rather the traditional "C" APIs. * * @ingroup utilities_library */ /** * @defgroup event_timer Periodic Events Timer * @brief Periodic Event Timer. * @details This timer generates an event at regular intervals. The * listening threads can use the event to perform time related activities. * Multiple threads can listen to the same timer. * * @ingroup utilities_library */