/*
    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 .
*/
/**
 * @addtogroup Config
 * @{
 */
#ifndef _CHCONF_H_
#define _CHCONF_H_
/** Configuration option: if specified then time efficient rather than space
 *  efficient code is used when two possible implementations exist, note
 *  that this is not related to the compiler optimization options.*/
#define CH_OPTIMIZE_SPEED
/** Configuration option: If enabled then the used of nested @p chSysLock() /
 *  @p chSysUnlock() operations is allowed.
 *  For performance and code size reasons the recommended setting is leave
 *  this option disabled.
 *  You can use this option if you need to merge ChibiOS/RT with external
 *  libraries that require nested lock/unlock operations.
 */
//#define CH_USE_NESTED_LOCKS
/** Configuration option: if specified then the kernel performs the round
 *  robin scheduling algorithm on threads of equal priority. */
#define CH_USE_ROUNDROBIN
/** Configuration option: if specified then the \p chThdWait() function
 *  is included in the kernel.*/
#define CH_USE_WAITEXIT
/** Configuration option: if specified then the Semaphores APIs are included
 *  in the kernel.*/
#define CH_USE_SEMAPHORES
/** Configuration option: if specified then the Semaphores atomic Signal+Wait
 *  APIs are included in the kernel.*/
#define CH_USE_SEMSW
/** Configuration option: if specified then the Semaphores with timeout APIs
 *  are included in the kernel.
 * @note requires \p CH_USE_SEMAPHORES.*/
#define CH_USE_SEMAPHORES_TIMEOUT
/** Configuration option: if specified then the Mutexes APIs are included in
 * the kernel.*/
#define CH_USE_MUTEXES
/** Configuration option: if specified then the Conditional Variables APIs are
 *  included in the kernel.
 * @note requires \p CH_USE_MUTEXES.*/
#define CH_USE_CONDVARS
/** Configuration option: if specified then the Conditional Variables APIs are
 *  included in the kernel.
 * @note requires \p CH_USE_CONDVARS and \p CH_USE_MUTEXES.*/
#define CH_USE_CONDVARS_TIMEOUT
/** Configuration option: if specified then the Events APIs are included in
 *  the kernel.*/
#define CH_USE_EVENTS
/** Configuration option: if specified then the \p chEvtWaitXXXTimeout()
 * functions are included in the kernel.
 * @note requires \p CH_USE_EVENTS.
 */
#define CH_USE_EVENTS_TIMEOUT
/** Configuration option: if specified then the Synchronous Messages APIs are
 *  included in the kernel.*/
#define CH_USE_MESSAGES
/** Configuration option: if specified then the \p chMsgSendWithEvent()
 *  function is included in the kernel.
 * @note requires \p CH_USE_MESSAGES.*/
#define CH_USE_MESSAGES_EVENT
/** Configuration option: If enabled then the threads serve messages by
 *  priority instead of FIFO order.
 * @note requires \p CH_USE_MESSAGES.*/
//#define CH_USE_MESSAGES_PRIORITY
/** Configuration option: if specified then the I/O queues APIs are included
 *  in the kernel.*/
#define CH_USE_QUEUES
/** Configuration option: if specified then the halfduplex queue APIs are
 *  included in the kernel.*/
#define CH_USE_QUEUES_HALFDUPLEX
/** Configuration option: if specified then the I/O queues with timeout
 *  APIs are included in the kernel.
 * @note requires \p CH_USE_SEMAPHORES_TIMEOUT.*/
#define CH_USE_QUEUES_TIMEOUT
/** Configuration option: if specified then the full duplex serial driver APIs
 *  are included in the kernel.*/
#define CH_USE_SERIAL_FULLDUPLEX
/** Configuration option: if specified then the half duplex serial driver APIs
 *  are included in the kernel.*/
#define CH_USE_SERIAL_HALFDUPLEX
/** Configuration option: if specified then the memory heap allocator APIs
 *  are included in the kernel.*/
#define CH_USE_HEAP
/** Configuration option: Number of RAM bytes to use as system heap. If set to
 *  zero then the whole available RAM is used as system heap.
 * @note In order to use the whole RAM as system heap the linker script must
 *       provide the \p __heap_base__ and \p __heap_end__ symbols.
 * @note requires \p CH_USE_HEAP.
 */
#define CH_HEAP_SIZE 0x20000
/** Configuration option: enforces the use of the C-runtime \p malloc() and
 *  \p free() functions as backend for the system heap allocator.*/
//#define CH_USE_MALLOC_HEAP
/** Configuration option: if specified then the memory pools allocator APIs
 *  are included in the kernel.*/
#define CH_USE_MEMPOOLS
/** Configuration option: if specified then the dynamic objects creation APIs
 *  are included in the kernel.
 * @note requires \p CH_USE_WAITEXIT.
 */
#define CH_USE_DYNAMIC
/** Configuration option: Frequency of the system timer that drives the system
 *  ticks. This also defines the system time unit.*/
#define CH_FREQUENCY 1000
/** Configuration option: This constant is the number of ticks allowed for the
 *  threads before preemption occurs. This option is only meaningful if the
 *  option \p CH_USE_ROUNDROBIN is also active.*/
#define CH_TIME_QUANTUM 20
/** Configuration option: Defines a CPU register to be used as storage for the
 *  global \p currp variable. Caching this variable in a register can greatly
 *  improve both space and time efficiency of the generated code. Another side
 *  effect is that one less register has to be saved during the context switch
 *  resulting in lower RAM usage and faster code.
 *  @note This option is only useable with the GCC compiler and is only useful
 *        on processors with many registers like ARM cores.
 *  @note If this option is enabled then ALL the libraries linked to the
 *        ChibiOS/RT code must be recompiled with the GCC option \p
 *        -ffixed-\.
 */
//#define CH_CURRP_REGISTER_CACHE "reg"
/** Configuration option: Includes basic debug support to the kernel.
 *  @note the debug support is port-dependent, it may be not present on some
 *       targets. In that case stub functions will be included.
 */
//#define CH_USE_DEBUG
/** Debug option: Includes the threads context switch tracing feature.
 */
//#define CH_USE_TRACE
/** User fields added to the end of the \p Thread structure. */
#define THREAD_EXT_FIELDS                                               \
struct {                                                                \
  /* Add thread custom fields here.*/                                   \
  /* The thread termination \p EventSource.*/                           \
  EventSource       p_exitesource;                                      \
};
/** User initialization code added to the \p chThdCreate() API.
 *  @note It is invoked from within \p chThdInit(). */
#define THREAD_EXT_INIT(tp) {                                           \
  /* Add thread initialization code here.*/                             \
  chEvtInit(&tp->p_exitesource);                                        \
}
/** User finalization code added to the \p chThdExit() API.
 *  @note It is inserted into lock zone. */
#define THREAD_EXT_EXIT(tp) {                                           \
  /* Add thread finalization code here.*/                               \
  chEvtBroadcastI(&currp->p_exitesource);                               \
}
#define chThdGetExitEventSource(tp) (&(tp)->p_exitesource)
#endif  /* _CHCONF_H_ */
/** @} */