diff options
Diffstat (limited to 'os/kernel/include')
-rw-r--r-- | os/kernel/include/ch.h | 12 | ||||
-rw-r--r-- | os/kernel/include/channels.h | 2 | ||||
-rw-r--r-- | os/kernel/include/condvars.h | 2 | ||||
-rw-r--r-- | os/kernel/include/debug.h | 2 | ||||
-rw-r--r-- | os/kernel/include/events.h | 2 | ||||
-rw-r--r-- | os/kernel/include/heap.h | 2 | ||||
-rw-r--r-- | os/kernel/include/inline.h | 2 | ||||
-rw-r--r-- | os/kernel/include/lists.h | 4 | ||||
-rw-r--r-- | os/kernel/include/mailboxes.h | 4 | ||||
-rw-r--r-- | os/kernel/include/memcore.h | 2 | ||||
-rw-r--r-- | os/kernel/include/mempools.h | 6 | ||||
-rw-r--r-- | os/kernel/include/messages.h | 2 | ||||
-rw-r--r-- | os/kernel/include/mutexes.h | 2 | ||||
-rw-r--r-- | os/kernel/include/queues.h | 484 | ||||
-rw-r--r-- | os/kernel/include/registry.h | 4 | ||||
-rw-r--r-- | os/kernel/include/scheduler.h | 268 | ||||
-rw-r--r-- | os/kernel/include/semaphores.h | 6 | ||||
-rw-r--r-- | os/kernel/include/streams.h | 2 | ||||
-rw-r--r-- | os/kernel/include/sys.h | 4 | ||||
-rw-r--r-- | os/kernel/include/threads.h | 660 | ||||
-rw-r--r-- | os/kernel/include/vt.h | 6 |
21 files changed, 739 insertions, 739 deletions
diff --git a/os/kernel/include/ch.h b/os/kernel/include/ch.h index a0b2ca6fd..8f3f07e21 100644 --- a/os/kernel/include/ch.h +++ b/os/kernel/include/ch.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -31,27 +31,27 @@ #define _CH_H_
/**
- * @brief ChibiOS/RT identification macro. + * @brief ChibiOS/RT identification macro.
*/
#define _CHIBIOS_RT_
/**
- * @brief Kernel version string. + * @brief Kernel version string.
*/
#define CH_KERNEL_VERSION "1.5.2unstable"
/**
- * @brief Kernel version major number. + * @brief Kernel version major number.
*/
#define CH_KERNEL_MAJOR 1
/**
- * @brief Kernel version minor number. + * @brief Kernel version minor number.
*/
#define CH_KERNEL_MINOR 5
/**
- * @brief Kernel version patch number. + * @brief Kernel version patch number.
*/
#define CH_KERNEL_PATCH 2
diff --git a/os/kernel/include/channels.h b/os/kernel/include/channels.h index 7e275af96..06c7cf88a 100644 --- a/os/kernel/include/channels.h +++ b/os/kernel/include/channels.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/condvars.h b/os/kernel/include/condvars.h index be40f7dd3..a84fa3bdb 100644 --- a/os/kernel/include/condvars.h +++ b/os/kernel/include/condvars.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/debug.h b/os/kernel/include/debug.h index b60171866..5cd056a81 100644 --- a/os/kernel/include/debug.h +++ b/os/kernel/include/debug.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/events.h b/os/kernel/include/events.h index 42f415b73..c434eb7ce 100644 --- a/os/kernel/include/events.h +++ b/os/kernel/include/events.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/heap.h b/os/kernel/include/heap.h index 0ebe1d7b5..8be48961a 100644 --- a/os/kernel/include/heap.h +++ b/os/kernel/include/heap.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/inline.h b/os/kernel/include/inline.h index 43f12f2e7..2b160f03f 100644 --- a/os/kernel/include/inline.h +++ b/os/kernel/include/inline.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/lists.h b/os/kernel/include/lists.h index 9240a6fcb..48841c687 100644 --- a/os/kernel/include/lists.h +++ b/os/kernel/include/lists.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -45,7 +45,7 @@ typedef struct Thread Thread; /**
* @brief Evaluates to @p TRUE if the specified threads queue or list is
- * empty. + * empty.
*/
#define isempty(p) ((p)->p_next == (Thread *)(p))
diff --git a/os/kernel/include/mailboxes.h b/os/kernel/include/mailboxes.h index 33048229f..d2c71b6d8 100644 --- a/os/kernel/include/mailboxes.h +++ b/os/kernel/include/mailboxes.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -102,7 +102,7 @@ extern "C" { * @note A message must be waiting in the queue for this function to work or
* it would return garbage. The correct way to use this macro is to
* use @p chMBGetFull() and then use this macro, all within a lock
- * state. + * state.
*/
#define chMBPeek(mbp) (*(mbp)->mb_rdptr)
diff --git a/os/kernel/include/memcore.h b/os/kernel/include/memcore.h index c0aa9c9a2..381339938 100644 --- a/os/kernel/include/memcore.h +++ b/os/kernel/include/memcore.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/mempools.h b/os/kernel/include/mempools.h index d6611663a..056ceaae8 100644 --- a/os/kernel/include/mempools.h +++ b/os/kernel/include/mempools.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -31,7 +31,7 @@ #if CH_USE_MEMPOOLS
/**
- * @brief Memory pool free object header. + * @brief Memory pool free object header.
*/
struct pool_header {
struct pool_header *ph_next; /**< @brief Pointer to the next pool
@@ -39,7 +39,7 @@ struct pool_header { };
/**
- * @brief Memory pool descriptor. + * @brief Memory pool descriptor.
*/
typedef struct {
struct pool_header *mp_next; /**< @brief Pointer to the header. */
diff --git a/os/kernel/include/messages.h b/os/kernel/include/messages.h index 669b1c8b9..d5e7cb32e 100644 --- a/os/kernel/include/messages.h +++ b/os/kernel/include/messages.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/mutexes.h b/os/kernel/include/mutexes.h index 5bdbcdbd9..a57e8386a 100644 --- a/os/kernel/include/mutexes.h +++ b/os/kernel/include/mutexes.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/queues.h b/os/kernel/include/queues.h index 124175133..fb2f13194 100644 --- a/os/kernel/include/queues.h +++ b/os/kernel/include/queues.h @@ -1,242 +1,242 @@ -/* - 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 <http://www.gnu.org/licenses/>. -*/ - -/** - * @file queues.h I/O - * @brief Queues macros and structures. - * - * @addtogroup io_queues - * @{ - */ - -#ifndef _QUEUES_H_ -#define _QUEUES_H_ - -#if CH_USE_QUEUES - -/* - * Module dependencies check. - */ -#if !CH_USE_SEMAPHORES -#error "CH_USE_QUEUES requires CH_USE_SEMAPHORES" -#endif - -/** @brief Queue notification callback type.*/ -typedef void (*qnotify_t)(void); - -/** @brief Returned by the queue functions if the operation is successful.*/ -#define Q_OK RDY_OK -/** @brief Returned by the queue functions if a timeout occurs.*/ -#define Q_TIMEOUT RDY_TIMEOUT -/** @brief Returned by the queue functions if the queue is reset.*/ -#define Q_RESET RDY_RESET -/** @brief Returned by the queue functions if the queue is empty.*/ -#define Q_EMPTY -3 -/** @brief Returned by the queue functions if the queue is full.*/ -#define Q_FULL -4 - -/** - * @brief Generic I/O queue structure. - * @details This structure represents a generic Input or Output asymmetrical - * queue. The queue is asymmetrical because one end is meant to be - * accessed from a thread context, and thus can be blocking, the other - * end is accessible from interrupt handlers or from within a kernel - * lock zone (see <b>I-Locked</b> and <b>S-Locked</b> states in - * @ref system_states) and is non-blocking. - */ -typedef struct { - uint8_t *q_buffer; /**< @brief Pointer to the queue buffer.*/ - uint8_t *q_top; /**< @brief Pointer to the first location - after the buffer. */ - uint8_t *q_wrptr; /**< @brief Write pointer. */ - uint8_t *q_rdptr; /**< @brief Read pointer. */ - Semaphore q_sem; /**< @brief Counter @p Semaphore. */ - qnotify_t q_notify; /**< @brief Data notification callback. */ -} GenericQueue; - -/** - * @brief Returns the queue's buffer size. - */ -#define chQSize(q) ((q)->q_top - (q)->q_buffer) - -/** - * @brief Queue space. - * @details Returns the used space if used on an Input Queue and the empty - * space if used on an Output Queue. - * @note The returned value can be less than zero when there are waiting - * threads on the internal semaphore. - */ -#define chQSpace(q) chSemGetCounterI(&(q)->q_sem) - -/** - * @extends GenericQueue - * - * @brief Input queue structure. - * @details This structure represents a generic asymmetrical input queue. - * Writing in the queue is non-blocking and can be performed from - * interrupt handlers or from within a kernel lock zone (see - * <b>I-Locked</b> and <b>S-Locked</b> states in @ref system_states). - * Reading the queue can be a blocking operation and is supposed to - * be performed by a system thread. - */ -typedef GenericQueue InputQueue; - -/** @brief Evaluates to @p TRUE if the specified Input Queue is empty.*/ -#define chIQIsEmpty(q) (chQSpace(q) <= 0) - -/** @brief Evaluates to @p TRUE if the specified Input Queue is full.*/ -#define chIQIsFull(q) (chQSpace(q) >= chQSize(q)) - -/** - * @brief Input queue read. - * @details This function reads a byte value from an input queue. If the queue - * is empty then the calling thread is suspended until a byte arrives - * in the queue. - * - * @param[in] iqp pointer to an @p InputQueue structure - * @return A byte value from the queue or: - * @retval Q_RESET if the queue was reset. - */ -#define chIQGet(iqp) chIQGetTimeout(iqp, TIME_INFINITE) - -/** - * @brief Data part of a static input queue initializer. - * @details This macro should be used when statically initializing an - * input queue that is part of a bigger structure. - * - * @param[in] name the name of the input queue variable - * @param[in] buffer pointer to the queue buffer area - * @param[in] size size of the queue buffer area - * @param[in] inotify input notification callback pointer - */ -#define _INPUTQUEUE_DATA(name, buffer, size, inotify) { \ - (uint8_t *)(buffer), \ - (uint8_t *)(buffer) + size, \ - (uint8_t *)(buffer), \ - (uint8_t *)(buffer), \ - _SEMAPHORE_DATA(name.q_sem, 0), \ - inotify \ -} - -/** - * @brief Static input queue initializer. - * @details Statically initialized input queues require no explicit - * initialization using @p chIQInit(). - * - * @param[in] name the name of the input queue variable - * @param[in] buffer pointer to the queue buffer area - * @param[in] size size of the queue buffer area - * @param[in] inotify input notification callback pointer - */ -#define INPUTQUEUE_DECL(name, buffer, size, inotify) \ - InputQueue name = _INPUTQUEUE_DATA(name, buffer, size, inotify) - -/** - * @extends GenericQueue - * - * @brief Output queue structure. - * @details This structure represents a generic asymmetrical output queue. - * Reading from the queue is non-blocking and can be performed from - * interrupt handlers or from within a kernel lock zone (see - * <b>I-Locked</b> and <b>S-Locked</b> states in @ref system_states). - * Writing the queue can be a blocking operation and is supposed to - * be performed by a system thread. - */ -typedef GenericQueue OutputQueue; - -/** - * @brief Evaluates to @p TRUE if the specified Output Queue is empty. - */ -#define chOQIsEmpty(q) (chQSpace(q) >= chQSize(q)) - -/** - * @brief Evaluates to @p TRUE if the specified Output Queue is full. - */ -#define chOQIsFull(q) (chQSpace(q) <= 0) - -/** - * @brief Output queue write. - * @details This function writes a byte value to an output queue. If the queue - * is full then the calling thread is suspended until there is space - * in the queue. - * - * @param[in] oqp pointer to an @p OutputQueue structure - * @param[in] b the byte value to be written in the queue - * @return The operation status: - * @retval Q_OK if the operation succeeded. - * @retval Q_RESET if the queue was reset. - */ -#define chOQPut(oqp, b) chOQPutTimeout(oqp, b, TIME_INFINITE) - -/** - * @brief Data part of a static output queue initializer. - * @details This macro should be used when statically initializing an - * output queue that is part of a bigger structure. - * - * @param[in] name the name of the output queue variable. - * @param[in] buffer pointer to the queue buffer area - * @param[in] size size of the queue buffer area - * @param[in] onotify output notification callback pointer - */ -#define _OUTPUTQUEUE_DATA(name, buffer, size, onotify) { \ - (uint8_t *)(buffer), \ - (uint8_t *)(buffer) + size, \ - (uint8_t *)(buffer), \ - (uint8_t *)(buffer), \ - _SEMAPHORE_DATA(name.q_sem, size), \ - onotify \ -} - -/** - * @brief Static output queue initializer. - * @details Statically initialized output queues require no explicit - * initialization using @p chOQInit(). - * - * @param[in] name the name of the output queue variable - * @param[in] buffer pointer to the queue buffer area - * @param[in] size size of the queue buffer area - * @param[in] onotify output notification callback pointer - */ -#define OUTPUTQUEUE_DECL(name, buffer, size, onotify) \ - InputQueue name = _OUTPUTQUEUE_DATA(name, buffer, size, onotify) - -#ifdef __cplusplus -extern "C" { -#endif - void chIQInit(InputQueue *qp, uint8_t *bp, size_t size, qnotify_t infy); - void chIQResetI(InputQueue *qp); - msg_t chIQPutI(InputQueue *qp, uint8_t b); - msg_t chIQGetTimeout(InputQueue *qp, systime_t time); - size_t chIQReadTimeout(InputQueue *qp, uint8_t *bp, - size_t n, systime_t time); - - void chOQInit(OutputQueue *queue, uint8_t *bp, size_t size, qnotify_t onfy); - void chOQResetI(OutputQueue *queue); - msg_t chOQPutTimeout(OutputQueue *queue, uint8_t b, systime_t time); - msg_t chOQGetI(OutputQueue *queue); - size_t chOQWriteTimeout(OutputQueue *queue, const uint8_t *bp, - size_t n, systime_t time); -#ifdef __cplusplus -} -#endif -#endif /* CH_USE_QUEUES */ - -#endif /* _QUEUES_H_ */ - -/** @} */ +/*
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file queues.h I/O
+ * @brief Queues macros and structures.
+ *
+ * @addtogroup io_queues
+ * @{
+ */
+
+#ifndef _QUEUES_H_
+#define _QUEUES_H_
+
+#if CH_USE_QUEUES
+
+/*
+ * Module dependencies check.
+ */
+#if !CH_USE_SEMAPHORES
+#error "CH_USE_QUEUES requires CH_USE_SEMAPHORES"
+#endif
+
+/** @brief Queue notification callback type.*/
+typedef void (*qnotify_t)(void);
+
+/** @brief Returned by the queue functions if the operation is successful.*/
+#define Q_OK RDY_OK
+/** @brief Returned by the queue functions if a timeout occurs.*/
+#define Q_TIMEOUT RDY_TIMEOUT
+/** @brief Returned by the queue functions if the queue is reset.*/
+#define Q_RESET RDY_RESET
+/** @brief Returned by the queue functions if the queue is empty.*/
+#define Q_EMPTY -3
+/** @brief Returned by the queue functions if the queue is full.*/
+#define Q_FULL -4
+
+/**
+ * @brief Generic I/O queue structure.
+ * @details This structure represents a generic Input or Output asymmetrical
+ * queue. The queue is asymmetrical because one end is meant to be
+ * accessed from a thread context, and thus can be blocking, the other
+ * end is accessible from interrupt handlers or from within a kernel
+ * lock zone (see <b>I-Locked</b> and <b>S-Locked</b> states in
+ * @ref system_states) and is non-blocking.
+ */
+typedef struct {
+ uint8_t *q_buffer; /**< @brief Pointer to the queue buffer.*/
+ uint8_t *q_top; /**< @brief Pointer to the first location
+ after the buffer. */
+ uint8_t *q_wrptr; /**< @brief Write pointer. */
+ uint8_t *q_rdptr; /**< @brief Read pointer. */
+ Semaphore q_sem; /**< @brief Counter @p Semaphore. */
+ qnotify_t q_notify; /**< @brief Data notification callback. */
+} GenericQueue;
+
+/**
+ * @brief Returns the queue's buffer size.
+ */
+#define chQSize(q) ((q)->q_top - (q)->q_buffer)
+
+/**
+ * @brief Queue space.
+ * @details Returns the used space if used on an Input Queue and the empty
+ * space if used on an Output Queue.
+ * @note The returned value can be less than zero when there are waiting
+ * threads on the internal semaphore.
+ */
+#define chQSpace(q) chSemGetCounterI(&(q)->q_sem)
+
+/**
+ * @extends GenericQueue
+ *
+ * @brief Input queue structure.
+ * @details This structure represents a generic asymmetrical input queue.
+ * Writing in the queue is non-blocking and can be performed from
+ * interrupt handlers or from within a kernel lock zone (see
+ * <b>I-Locked</b> and <b>S-Locked</b> states in @ref system_states).
+ * Reading the queue can be a blocking operation and is supposed to
+ * be performed by a system thread.
+ */
+typedef GenericQueue InputQueue;
+
+/** @brief Evaluates to @p TRUE if the specified Input Queue is empty.*/
+#define chIQIsEmpty(q) (chQSpace(q) <= 0)
+
+/** @brief Evaluates to @p TRUE if the specified Input Queue is full.*/
+#define chIQIsFull(q) (chQSpace(q) >= chQSize(q))
+
+/**
+ * @brief Input queue read.
+ * @details This function reads a byte value from an input queue. If the queue
+ * is empty then the calling thread is suspended until a byte arrives
+ * in the queue.
+ *
+ * @param[in] iqp pointer to an @p InputQueue structure
+ * @return A byte value from the queue or:
+ * @retval Q_RESET if the queue was reset.
+ */
+#define chIQGet(iqp) chIQGetTimeout(iqp, TIME_INFINITE)
+
+/**
+ * @brief Data part of a static input queue initializer.
+ * @details This macro should be used when statically initializing an
+ * input queue that is part of a bigger structure.
+ *
+ * @param[in] name the name of the input queue variable
+ * @param[in] buffer pointer to the queue buffer area
+ * @param[in] size size of the queue buffer area
+ * @param[in] inotify input notification callback pointer
+ */
+#define _INPUTQUEUE_DATA(name, buffer, size, inotify) { \
+ (uint8_t *)(buffer), \
+ (uint8_t *)(buffer) + size, \
+ (uint8_t *)(buffer), \
+ (uint8_t *)(buffer), \
+ _SEMAPHORE_DATA(name.q_sem, 0), \
+ inotify \
+}
+
+/**
+ * @brief Static input queue initializer.
+ * @details Statically initialized input queues require no explicit
+ * initialization using @p chIQInit().
+ *
+ * @param[in] name the name of the input queue variable
+ * @param[in] buffer pointer to the queue buffer area
+ * @param[in] size size of the queue buffer area
+ * @param[in] inotify input notification callback pointer
+ */
+#define INPUTQUEUE_DECL(name, buffer, size, inotify) \
+ InputQueue name = _INPUTQUEUE_DATA(name, buffer, size, inotify)
+
+/**
+ * @extends GenericQueue
+ *
+ * @brief Output queue structure.
+ * @details This structure represents a generic asymmetrical output queue.
+ * Reading from the queue is non-blocking and can be performed from
+ * interrupt handlers or from within a kernel lock zone (see
+ * <b>I-Locked</b> and <b>S-Locked</b> states in @ref system_states).
+ * Writing the queue can be a blocking operation and is supposed to
+ * be performed by a system thread.
+ */
+typedef GenericQueue OutputQueue;
+
+/**
+ * @brief Evaluates to @p TRUE if the specified Output Queue is empty.
+ */
+#define chOQIsEmpty(q) (chQSpace(q) >= chQSize(q))
+
+/**
+ * @brief Evaluates to @p TRUE if the specified Output Queue is full.
+ */
+#define chOQIsFull(q) (chQSpace(q) <= 0)
+
+/**
+ * @brief Output queue write.
+ * @details This function writes a byte value to an output queue. If the queue
+ * is full then the calling thread is suspended until there is space
+ * in the queue.
+ *
+ * @param[in] oqp pointer to an @p OutputQueue structure
+ * @param[in] b the byte value to be written in the queue
+ * @return The operation status:
+ * @retval Q_OK if the operation succeeded.
+ * @retval Q_RESET if the queue was reset.
+ */
+#define chOQPut(oqp, b) chOQPutTimeout(oqp, b, TIME_INFINITE)
+
+/**
+ * @brief Data part of a static output queue initializer.
+ * @details This macro should be used when statically initializing an
+ * output queue that is part of a bigger structure.
+ *
+ * @param[in] name the name of the output queue variable.
+ * @param[in] buffer pointer to the queue buffer area
+ * @param[in] size size of the queue buffer area
+ * @param[in] onotify output notification callback pointer
+ */
+#define _OUTPUTQUEUE_DATA(name, buffer, size, onotify) { \
+ (uint8_t *)(buffer), \
+ (uint8_t *)(buffer) + size, \
+ (uint8_t *)(buffer), \
+ (uint8_t *)(buffer), \
+ _SEMAPHORE_DATA(name.q_sem, size), \
+ onotify \
+}
+
+/**
+ * @brief Static output queue initializer.
+ * @details Statically initialized output queues require no explicit
+ * initialization using @p chOQInit().
+ *
+ * @param[in] name the name of the output queue variable
+ * @param[in] buffer pointer to the queue buffer area
+ * @param[in] size size of the queue buffer area
+ * @param[in] onotify output notification callback pointer
+ */
+#define OUTPUTQUEUE_DECL(name, buffer, size, onotify) \
+ InputQueue name = _OUTPUTQUEUE_DATA(name, buffer, size, onotify)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void chIQInit(InputQueue *qp, uint8_t *bp, size_t size, qnotify_t infy);
+ void chIQResetI(InputQueue *qp);
+ msg_t chIQPutI(InputQueue *qp, uint8_t b);
+ msg_t chIQGetTimeout(InputQueue *qp, systime_t time);
+ size_t chIQReadTimeout(InputQueue *qp, uint8_t *bp,
+ size_t n, systime_t time);
+
+ void chOQInit(OutputQueue *queue, uint8_t *bp, size_t size, qnotify_t onfy);
+ void chOQResetI(OutputQueue *queue);
+ msg_t chOQPutTimeout(OutputQueue *queue, uint8_t b, systime_t time);
+ msg_t chOQGetI(OutputQueue *queue);
+ size_t chOQWriteTimeout(OutputQueue *queue, const uint8_t *bp,
+ size_t n, systime_t time);
+#ifdef __cplusplus
+}
+#endif
+#endif /* CH_USE_QUEUES */
+
+#endif /* _QUEUES_H_ */
+
+/** @} */
diff --git a/os/kernel/include/registry.h b/os/kernel/include/registry.h index afaf3c5f7..2bff903e8 100644 --- a/os/kernel/include/registry.h +++ b/os/kernel/include/registry.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -34,7 +34,7 @@ * @brief Removes a thread from the registry list.
* @note This macro is not meant for use in application code.
*
- * @param[in] tp thread to remove from the registry + * @param[in] tp thread to remove from the registry
*/
#define REG_REMOVE(tp) { \
(tp)->p_older->p_newer = (tp)->p_newer; \
diff --git a/os/kernel/include/scheduler.h b/os/kernel/include/scheduler.h index e6bc69078..ddb7df979 100644 --- a/os/kernel/include/scheduler.h +++ b/os/kernel/include/scheduler.h @@ -1,134 +1,134 @@ -/* - 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 <http://www.gnu.org/licenses/>. -*/ - -/** - * @file scheduler.h - * @brief Scheduler macros and structures. - * - * @addtogroup scheduler - * @{ - */ - -#ifndef _SCHEDULER_H_ -#define _SCHEDULER_H_ - -/** @brief Default thread wakeup low level message.*/ -#define RDY_OK 0 -/** @brief Low level message sent to a thread awakened by a timeout.*/ -#define RDY_TIMEOUT -1 -/** @brief Low level message sent to a thread awakened by a reset operation.*/ -#define RDY_RESET -2 - -#define NOPRIO 0 /**< @brief Ready list header priority. */ -#define IDLEPRIO 1 /**< @brief Idle thread priority. */ -#define LOWPRIO 2 /**< @brief Lowest user priority. */ -#define NORMALPRIO 64 /**< @brief Normal user priority. */ -#define HIGHPRIO 127 /**< @brief Highest user priority. */ -#define ABSPRIO 255 /**< @brief Greatest possible priority. */ - -/** - * @brief Zero time specification for some syscalls with a timeout - * specification. - * @note Not all functions accept @p TIME_IMMEDIATE as timeout parameter, - * see the specific function documentation. - */ -#define TIME_IMMEDIATE ((systime_t)-1) - -/** - * @brief Infinite time specification for all the syscalls with a timeout - * specification. - */ -#define TIME_INFINITE ((systime_t)0) - -/** - * @brief Returns the priority of the first thread on the given ready list. - */ -#define firstprio(rlp) ((rlp)->p_next->p_prio) - -/** - * @extends ThreadsQueue - * - * @brief Ready list header. - */ -typedef struct { - ThreadsQueue r_queue; /**< @brief Threads queue. */ - tprio_t r_prio; /**< @brief This field must be - initialized to zero. */ - struct context p_ctx; /**< @brief Not used, present because - offsets. */ -#if CH_USE_REGISTRY - Thread *p_newer; /**< @brief Newer registry element. */ - Thread *p_older; /**< @brief Older registry element. */ -#endif - /* End of the fields shared with the Thread structure.*/ -#if CH_TIME_QUANTUM > 0 - cnt_t r_preempt; /**< @brief Round robin counter. */ -#endif -#ifndef CH_CURRP_REGISTER_CACHE - Thread *r_current; /**< @brief The currently running - thread. */ -#endif -} ReadyList; - -#if !defined(__DOXYGEN__) -extern ReadyList rlist; -#endif - -#ifdef CH_CURRP_REGISTER_CACHE -register Thread *currp asm(CH_CURRP_REGISTER_CACHE); -#else -#define currp rlist.r_current -#endif - -/* - * Scheduler APIs. - */ -#ifdef __cplusplus -extern "C" { -#endif - void scheduler_init(void); - Thread *chSchReadyI(Thread *tp); - void chSchGoSleepS(tstate_t newstate); - msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t time); - void chSchWakeupS(Thread *tp, msg_t msg); - void chSchDoRescheduleI(void); - void chSchRescheduleS(void); - bool_t chSchIsRescRequiredExI(void); - void chSchDoYieldS(void); -#ifdef __cplusplus -} -#endif - -/** - * @brief Determines if yielding is possible. - * @details This function returns @p TRUE if there is a ready thread with - * equal or higher priority. - */ -#define chSchCanYieldS() (firstprio(&rlist.r_queue) >= currp->p_prio) - -/** - * @brief Determines if the current thread must reschedule. - * @details This function returns @p TRUE if there is a ready thread with - * higher priority. - */ -#define chSchIsRescRequiredI() (firstprio(&rlist.r_queue) > currp->p_prio) - -#endif /* _SCHEDULER_H_ */ - -/** @} */ +/*
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file scheduler.h
+ * @brief Scheduler macros and structures.
+ *
+ * @addtogroup scheduler
+ * @{
+ */
+
+#ifndef _SCHEDULER_H_
+#define _SCHEDULER_H_
+
+/** @brief Default thread wakeup low level message.*/
+#define RDY_OK 0
+/** @brief Low level message sent to a thread awakened by a timeout.*/
+#define RDY_TIMEOUT -1
+/** @brief Low level message sent to a thread awakened by a reset operation.*/
+#define RDY_RESET -2
+
+#define NOPRIO 0 /**< @brief Ready list header priority. */
+#define IDLEPRIO 1 /**< @brief Idle thread priority. */
+#define LOWPRIO 2 /**< @brief Lowest user priority. */
+#define NORMALPRIO 64 /**< @brief Normal user priority. */
+#define HIGHPRIO 127 /**< @brief Highest user priority. */
+#define ABSPRIO 255 /**< @brief Greatest possible priority. */
+
+/**
+ * @brief Zero time specification for some syscalls with a timeout
+ * specification.
+ * @note Not all functions accept @p TIME_IMMEDIATE as timeout parameter,
+ * see the specific function documentation.
+ */
+#define TIME_IMMEDIATE ((systime_t)-1)
+
+/**
+ * @brief Infinite time specification for all the syscalls with a timeout
+ * specification.
+ */
+#define TIME_INFINITE ((systime_t)0)
+
+/**
+ * @brief Returns the priority of the first thread on the given ready list.
+ */
+#define firstprio(rlp) ((rlp)->p_next->p_prio)
+
+/**
+ * @extends ThreadsQueue
+ *
+ * @brief Ready list header.
+ */
+typedef struct {
+ ThreadsQueue r_queue; /**< @brief Threads queue. */
+ tprio_t r_prio; /**< @brief This field must be
+ initialized to zero. */
+ struct context p_ctx; /**< @brief Not used, present because
+ offsets. */
+#if CH_USE_REGISTRY
+ Thread *p_newer; /**< @brief Newer registry element. */
+ Thread *p_older; /**< @brief Older registry element. */
+#endif
+ /* End of the fields shared with the Thread structure.*/
+#if CH_TIME_QUANTUM > 0
+ cnt_t r_preempt; /**< @brief Round robin counter. */
+#endif
+#ifndef CH_CURRP_REGISTER_CACHE
+ Thread *r_current; /**< @brief The currently running
+ thread. */
+#endif
+} ReadyList;
+
+#if !defined(__DOXYGEN__)
+extern ReadyList rlist;
+#endif
+
+#ifdef CH_CURRP_REGISTER_CACHE
+register Thread *currp asm(CH_CURRP_REGISTER_CACHE);
+#else
+#define currp rlist.r_current
+#endif
+
+/*
+ * Scheduler APIs.
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void scheduler_init(void);
+ Thread *chSchReadyI(Thread *tp);
+ void chSchGoSleepS(tstate_t newstate);
+ msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t time);
+ void chSchWakeupS(Thread *tp, msg_t msg);
+ void chSchDoRescheduleI(void);
+ void chSchRescheduleS(void);
+ bool_t chSchIsRescRequiredExI(void);
+ void chSchDoYieldS(void);
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @brief Determines if yielding is possible.
+ * @details This function returns @p TRUE if there is a ready thread with
+ * equal or higher priority.
+ */
+#define chSchCanYieldS() (firstprio(&rlist.r_queue) >= currp->p_prio)
+
+/**
+ * @brief Determines if the current thread must reschedule.
+ * @details This function returns @p TRUE if there is a ready thread with
+ * higher priority.
+ */
+#define chSchIsRescRequiredI() (firstprio(&rlist.r_queue) > currp->p_prio)
+
+#endif /* _SCHEDULER_H_ */
+
+/** @} */
diff --git a/os/kernel/include/semaphores.h b/os/kernel/include/semaphores.h index b2fbba65c..cced49601 100644 --- a/os/kernel/include/semaphores.h +++ b/os/kernel/include/semaphores.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -62,7 +62,7 @@ extern "C" { * @brief Data part of a static semaphore initializer.
* @details This macro should be used when statically initializing a semaphore
* that is part of a bigger structure.
- * + *
* @param[in] name the name of the semaphore variable
* @param[in] n the counter initial value, this value must be
* non-negative
@@ -76,7 +76,7 @@ extern "C" { *
* @param[in] name the name of the semaphore variable
* @param[in] n the counter initial value, this value must be
- * non-negative + * non-negative
*/
#define SEMAPHORE_DECL(name, n) Semaphore name = _SEMAPHORE_DATA(name, n)
diff --git a/os/kernel/include/streams.h b/os/kernel/include/streams.h index b4f7f4901..fa376546c 100644 --- a/os/kernel/include/streams.h +++ b/os/kernel/include/streams.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
diff --git a/os/kernel/include/sys.h b/os/kernel/include/sys.h index a6409d3bf..5d0b6d875 100644 --- a/os/kernel/include/sys.h +++ b/os/kernel/include/sys.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -154,7 +154,7 @@ #define CH_IRQ_EPILOGUE() PORT_IRQ_EPILOGUE()
/**
- * @brief Standard IRQ handler declaration. + * @brief Standard IRQ handler declaration.
* @note @p id can be a function name or a vector number depending on the
* port implementation.
*/
diff --git a/os/kernel/include/threads.h b/os/kernel/include/threads.h index 253b220fe..9f519fea0 100644 --- a/os/kernel/include/threads.h +++ b/os/kernel/include/threads.h @@ -1,330 +1,330 @@ -/* - 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 <http://www.gnu.org/licenses/>. -*/ - -/** - * @file threads.h - * @brief Threads macros and structures. - * - * @addtogroup threads - * @{ - */ - -#ifndef _THREADS_H_ -#define _THREADS_H_ - -/* - * Module dependencies check. - */ -#if CH_USE_DYNAMIC && !CH_USE_WAITEXIT -#error "CH_USE_DYNAMIC requires CH_USE_WAITEXIT" -#endif -#if CH_USE_DYNAMIC && !CH_USE_HEAP && !CH_USE_MEMPOOLS -#error "CH_USE_DYNAMIC requires CH_USE_HEAP and/or CH_USE_MEMPOOLS" -#endif - -/** - * @extends ThreadsQueue - * - * @brief Structure representing a thread. - * @note Not all the listed fields are always needed, by switching off some - * not needed ChibiOS/RT subsystems it is possible to save RAM space - * by shrinking the @p Thread structure. - */ -struct Thread { - Thread *p_next; /**< @brief Next in the list/queue. */ - /* End of the fields shared with the ThreadsList structure. */ - Thread *p_prev; /**< @brief Previous in the queue. */ - /* End of the fields shared with the ThreadsQueue structure. */ - tprio_t p_prio; /**< @brief Thread priority. */ - struct context p_ctx; /**< @brief Processor context. */ -#if CH_USE_REGISTRY - Thread *p_newer; /**< @brief Newer registry element. */ - Thread *p_older; /**< @brief Older registry element. */ -#endif - /* End of the fields shared with the ReadyList structure. */ - /** - * @brief Current thread state. - */ - tstate_t p_state; - /** - * @brief Various thread flags. - */ - tmode_t p_flags; -#if CH_USE_DYNAMIC - /** - * @brief References to this thread. - */ - trefs_t p_refs; -#endif -#if CH_USE_NESTED_LOCKS - /** - * @brief Number of nested locks. - */ - cnt_t p_locks; -#endif -#if CH_DBG_THREADS_PROFILING - /** - * @brief Thread consumed time in ticks. - * @note This field can overflow. - */ - volatile systime_t p_time; -#endif - /** - * @brief State-specific fields. - * @note All the fields declared in this union are only valid in the - * specified state or condition and are thus volatile. - */ - union { - /** - * @brief Thread wakeup code. - * @note This field contains the low level message sent to the thread - * by the waking thread or interrupt handler. The value is valid - * after exiting the @p chSchWakeupS() function. - */ - msg_t rdymsg; - /** - * @brief Thread exit code. - * @note The thread termination code is stored in this field in order - * to be retrieved by the thread performing a @p chThdWait() on - * this thread. - */ - msg_t exitcode; - /** - * @brief Pointer to a generic "wait" object. - * @note This field is used to get a generic pointer to a synchronization - * object and is valid when the thread is in one of the wait - * states. - */ - void *wtobjp; -#if CH_USE_EVENTS - /** - * @brief Enabled events mask. - * @note This field is only valied while the thread is in the - * @p THD_STATE_WTOREVT or @p THD_STATE_WTANDEVT states. - */ - eventmask_t ewmask; -#endif - } p_u; -#if CH_USE_WAITEXIT - /** - * @brief Termination waiting list. - */ - ThreadsList p_waiting; -#endif -#if CH_USE_MESSAGES - /** - * @brief Messages queue. - */ - ThreadsQueue p_msgqueue; - /** - * @brief Thread message. - */ - msg_t p_msg; -#endif -#if CH_USE_EVENTS - /** - * @brief Pending events mask. - */ - eventmask_t p_epending; -#endif -#if CH_USE_MUTEXES - /** - * @brief List of the mutexes owned by this thread. - * @note The list is terminated by a @p NULL in this field. - */ - Mutex *p_mtxlist; - /** - * @brief Thread's own, non-inherited, priority. - */ - tprio_t p_realprio; -#endif -#if CH_USE_DYNAMIC && CH_USE_MEMPOOLS - /** - * @brief Memory Pool where the thread workspace is returned. - */ - void *p_mpool; -#endif - /* Extra fields defined in chconf.h.*/ - THREAD_EXT_FIELDS -}; - -/** @brief Thread state: Ready to run, waiting on the ready list.*/ -#define THD_STATE_READY 0 -/** @brief Thread state: Currently running.*/ -#define THD_STATE_CURRENT 1 -/** @brief Thread state: Thread created in suspended state.*/ -#define THD_STATE_SUSPENDED 2 -/** @brief Thread state: Waiting on a semaphore.*/ -#define THD_STATE_WTSEM 3 -/** @brief Thread state: Waiting on a mutex.*/ -#define THD_STATE_WTMTX 4 -/** @brief Thread state: Waiting in @p chCondWait().*/ -#define THD_STATE_WTCOND 5 -/** @brief Thread state: Waiting in @p chThdSleep() or @p chThdSleepUntil().*/ -#define THD_STATE_SLEEPING 6 -/** @brief Thread state: Waiting in @p chThdWait().*/ -#define THD_STATE_WTEXIT 7 -/** @brief Thread state: Waiting in @p chEvtWaitXXX().*/ -#define THD_STATE_WTOREVT 8 -/** @brief Thread state: Waiting in @p chEvtWaitAllTimeout().*/ -#define THD_STATE_WTANDEVT 9 -/** @brief Thread state: Waiting in @p chMsgSend().*/ -#define THD_STATE_SNDMSG 10 -/** @brief Thread state: Waiting in @p chMsgWait().*/ -#define THD_STATE_WTMSG 11 -/** @brief Thread state: After termination.*/ -#define THD_STATE_FINAL 12 - -/* - * Various flags into the thread p_flags field. - */ -#define THD_MEM_MODE_MASK 3 /**< @brief Thread memory mode mask. */ -#define THD_MEM_MODE_STATIC 0 /**< @brief Thread memory mode: static. */ -#define THD_MEM_MODE_HEAP 1 /**< @brief Thread memory mode: heap. */ -#define THD_MEM_MODE_MEMPOOL 2 /**< @brief Thread memory mode: pool. */ -#define THD_TERMINATE 4 /**< @brief Termination requested. */ - -/** @brief Thread function.*/ -typedef msg_t (*tfunc_t)(void *); - -/* - * Threads APIs. - */ -#ifdef __cplusplus -extern "C" { -#endif - Thread *init_thread(Thread *tp, tprio_t prio); - Thread *chThdInit(void *wsp, size_t size, - tprio_t prio, tfunc_t pf, void *arg); - Thread *chThdCreateStatic(void *wsp, size_t size, - tprio_t prio, tfunc_t pf, void *arg); -#if CH_USE_DYNAMIC && CH_USE_WAITEXIT && CH_USE_HEAP - Thread *chThdCreateFromHeap(MemoryHeap *heapp, size_t size, - tprio_t prio, tfunc_t pf, void *arg); -#endif -#if CH_USE_DYNAMIC && CH_USE_WAITEXIT && CH_USE_MEMPOOLS - Thread *chThdCreateFromMemoryPool(MemoryPool *mp, tprio_t prio, - tfunc_t pf, void *arg); -#endif - tprio_t chThdSetPriority(tprio_t newprio); - Thread *chThdResume(Thread *tp); - void chThdTerminate(Thread *tp); - void chThdSleep(systime_t time); - void chThdSleepUntil(systime_t time); - void chThdYield(void); - void chThdExit(msg_t msg); -#if CH_USE_DYNAMIC - Thread *chThdAddRef(Thread *tp); - void chThdRelease(Thread *tp); -#endif -#if CH_USE_WAITEXIT - msg_t chThdWait(Thread *tp); -#endif -#ifdef __cplusplus -} -#endif - -/** - * @brief Returns a pointer to the current @p Thread. - */ -#define chThdSelf() currp - -/** - * @brief Returns the current thread priority. - */ -#define chThdGetPriority() (currp->p_prio) - -/** - * @brief Returns the pointer to the @p Thread local storage area, if any. - */ -#define chThdLS() (void *)(currp + 1) - -/** - * @brief Verifies if the specified thread is in the @p THD_STATE_FINAL state. - * - * @param[in] tp the pointer to the thread - * @retval TRUE thread terminated. - * @retval FALSE thread not terminated. - */ -#define chThdTerminated(tp) ((tp)->p_state == THD_STATE_FINAL) - -/** - * @brief Verifies if the current thread has a termination request pending. - * - * @retval TRUE termination request pended. - * @retval FALSE termination request not pended. - */ -#define chThdShouldTerminate() (currp->p_flags & THD_TERMINATE) - -/** - * @brief Resumes a thread created with @p chThdInit(). - * - * @param[in] tp the pointer to the thread - */ -#define chThdResumeI(tp) chSchReadyI(tp) - -/** - * @brief Suspends the invoking thread for the specified time. - * - * @param[in] time the delay in system ticks, the special values are - * handled as follow: - * - @a TIME_INFINITE the thread enters an infinite sleep - * state. - * - @a TIME_IMMEDIATE this value is accepted but - * interpreted as a normal time specification not as - * an immediate timeout specification. - * . - */ -#define chThdSleepS(time) chSchGoSleepTimeoutS(THD_STATE_SLEEPING, time) - -/** - * @brief Delays the invoking thread for the specified number of seconds. - * @note The specified time is rounded up to a value allowed by the real - * system clock. - * @note The maximum specified value is implementation dependent. - * - * @param[in] sec the time in seconds - */ -#define chThdSleepSeconds(sec) chThdSleep(S2ST(sec)) - -/** - * @brief Delays the invoking thread for the specified number of - * milliseconds. - * @note The specified time is rounded up to a value allowed by the real - * system clock. - * @note The maximum specified value is implementation dependent. - * - * @param[in] msec the time in milliseconds - */ -#define chThdSleepMilliseconds(msec) chThdSleep(MS2ST(msec)) - -/** - * @brief Delays the invoking thread for the specified number of - * microseconds. - * @note The specified time is rounded up to a value allowed by the real - * system clock. - * @note The maximum specified value is implementation dependent. - * - * @param[in] usec the time in microseconds - */ -#define chThdSleepMicroseconds(usec) chThdSleep(US2ST(usec)) - -#endif /* _THREADS_H_ */ - -/** @} */ +/*
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file threads.h
+ * @brief Threads macros and structures.
+ *
+ * @addtogroup threads
+ * @{
+ */
+
+#ifndef _THREADS_H_
+#define _THREADS_H_
+
+/*
+ * Module dependencies check.
+ */
+#if CH_USE_DYNAMIC && !CH_USE_WAITEXIT
+#error "CH_USE_DYNAMIC requires CH_USE_WAITEXIT"
+#endif
+#if CH_USE_DYNAMIC && !CH_USE_HEAP && !CH_USE_MEMPOOLS
+#error "CH_USE_DYNAMIC requires CH_USE_HEAP and/or CH_USE_MEMPOOLS"
+#endif
+
+/**
+ * @extends ThreadsQueue
+ *
+ * @brief Structure representing a thread.
+ * @note Not all the listed fields are always needed, by switching off some
+ * not needed ChibiOS/RT subsystems it is possible to save RAM space
+ * by shrinking the @p Thread structure.
+ */
+struct Thread {
+ Thread *p_next; /**< @brief Next in the list/queue. */
+ /* End of the fields shared with the ThreadsList structure. */
+ Thread *p_prev; /**< @brief Previous in the queue. */
+ /* End of the fields shared with the ThreadsQueue structure. */
+ tprio_t p_prio; /**< @brief Thread priority. */
+ struct context p_ctx; /**< @brief Processor context. */
+#if CH_USE_REGISTRY
+ Thread *p_newer; /**< @brief Newer registry element. */
+ Thread *p_older; /**< @brief Older registry element. */
+#endif
+ /* End of the fields shared with the ReadyList structure. */
+ /**
+ * @brief Current thread state.
+ */
+ tstate_t p_state;
+ /**
+ * @brief Various thread flags.
+ */
+ tmode_t p_flags;
+#if CH_USE_DYNAMIC
+ /**
+ * @brief References to this thread.
+ */
+ trefs_t p_refs;
+#endif
+#if CH_USE_NESTED_LOCKS
+ /**
+ * @brief Number of nested locks.
+ */
+ cnt_t p_locks;
+#endif
+#if CH_DBG_THREADS_PROFILING
+ /**
+ * @brief Thread consumed time in ticks.
+ * @note This field can overflow.
+ */
+ volatile systime_t p_time;
+#endif
+ /**
+ * @brief State-specific fields.
+ * @note All the fields declared in this union are only valid in the
+ * specified state or condition and are thus volatile.
+ */
+ union {
+ /**
+ * @brief Thread wakeup code.
+ * @note This field contains the low level message sent to the thread
+ * by the waking thread or interrupt handler. The value is valid
+ * after exiting the @p chSchWakeupS() function.
+ */
+ msg_t rdymsg;
+ /**
+ * @brief Thread exit code.
+ * @note The thread termination code is stored in this field in order
+ * to be retrieved by the thread performing a @p chThdWait() on
+ * this thread.
+ */
+ msg_t exitcode;
+ /**
+ * @brief Pointer to a generic "wait" object.
+ * @note This field is used to get a generic pointer to a synchronization
+ * object and is valid when the thread is in one of the wait
+ * states.
+ */
+ void *wtobjp;
+#if CH_USE_EVENTS
+ /**
+ * @brief Enabled events mask.
+ * @note This field is only valied while the thread is in the
+ * @p THD_STATE_WTOREVT or @p THD_STATE_WTANDEVT states.
+ */
+ eventmask_t ewmask;
+#endif
+ } p_u;
+#if CH_USE_WAITEXIT
+ /**
+ * @brief Termination waiting list.
+ */
+ ThreadsList p_waiting;
+#endif
+#if CH_USE_MESSAGES
+ /**
+ * @brief Messages queue.
+ */
+ ThreadsQueue p_msgqueue;
+ /**
+ * @brief Thread message.
+ */
+ msg_t p_msg;
+#endif
+#if CH_USE_EVENTS
+ /**
+ * @brief Pending events mask.
+ */
+ eventmask_t p_epending;
+#endif
+#if CH_USE_MUTEXES
+ /**
+ * @brief List of the mutexes owned by this thread.
+ * @note The list is terminated by a @p NULL in this field.
+ */
+ Mutex *p_mtxlist;
+ /**
+ * @brief Thread's own, non-inherited, priority.
+ */
+ tprio_t p_realprio;
+#endif
+#if CH_USE_DYNAMIC && CH_USE_MEMPOOLS
+ /**
+ * @brief Memory Pool where the thread workspace is returned.
+ */
+ void *p_mpool;
+#endif
+ /* Extra fields defined in chconf.h.*/
+ THREAD_EXT_FIELDS
+};
+
+/** @brief Thread state: Ready to run, waiting on the ready list.*/
+#define THD_STATE_READY 0
+/** @brief Thread state: Currently running.*/
+#define THD_STATE_CURRENT 1
+/** @brief Thread state: Thread created in suspended state.*/
+#define THD_STATE_SUSPENDED 2
+/** @brief Thread state: Waiting on a semaphore.*/
+#define THD_STATE_WTSEM 3
+/** @brief Thread state: Waiting on a mutex.*/
+#define THD_STATE_WTMTX 4
+/** @brief Thread state: Waiting in @p chCondWait().*/
+#define THD_STATE_WTCOND 5
+/** @brief Thread state: Waiting in @p chThdSleep() or @p chThdSleepUntil().*/
+#define THD_STATE_SLEEPING 6
+/** @brief Thread state: Waiting in @p chThdWait().*/
+#define THD_STATE_WTEXIT 7
+/** @brief Thread state: Waiting in @p chEvtWaitXXX().*/
+#define THD_STATE_WTOREVT 8
+/** @brief Thread state: Waiting in @p chEvtWaitAllTimeout().*/
+#define THD_STATE_WTANDEVT 9
+/** @brief Thread state: Waiting in @p chMsgSend().*/
+#define THD_STATE_SNDMSG 10
+/** @brief Thread state: Waiting in @p chMsgWait().*/
+#define THD_STATE_WTMSG 11
+/** @brief Thread state: After termination.*/
+#define THD_STATE_FINAL 12
+
+/*
+ * Various flags into the thread p_flags field.
+ */
+#define THD_MEM_MODE_MASK 3 /**< @brief Thread memory mode mask. */
+#define THD_MEM_MODE_STATIC 0 /**< @brief Thread memory mode: static. */
+#define THD_MEM_MODE_HEAP 1 /**< @brief Thread memory mode: heap. */
+#define THD_MEM_MODE_MEMPOOL 2 /**< @brief Thread memory mode: pool. */
+#define THD_TERMINATE 4 /**< @brief Termination requested. */
+
+/** @brief Thread function.*/
+typedef msg_t (*tfunc_t)(void *);
+
+/*
+ * Threads APIs.
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+ Thread *init_thread(Thread *tp, tprio_t prio);
+ Thread *chThdInit(void *wsp, size_t size,
+ tprio_t prio, tfunc_t pf, void *arg);
+ Thread *chThdCreateStatic(void *wsp, size_t size,
+ tprio_t prio, tfunc_t pf, void *arg);
+#if CH_USE_DYNAMIC && CH_USE_WAITEXIT && CH_USE_HEAP
+ Thread *chThdCreateFromHeap(MemoryHeap *heapp, size_t size,
+ tprio_t prio, tfunc_t pf, void *arg);
+#endif
+#if CH_USE_DYNAMIC && CH_USE_WAITEXIT && CH_USE_MEMPOOLS
+ Thread *chThdCreateFromMemoryPool(MemoryPool *mp, tprio_t prio,
+ tfunc_t pf, void *arg);
+#endif
+ tprio_t chThdSetPriority(tprio_t newprio);
+ Thread *chThdResume(Thread *tp);
+ void chThdTerminate(Thread *tp);
+ void chThdSleep(systime_t time);
+ void chThdSleepUntil(systime_t time);
+ void chThdYield(void);
+ void chThdExit(msg_t msg);
+#if CH_USE_DYNAMIC
+ Thread *chThdAddRef(Thread *tp);
+ void chThdRelease(Thread *tp);
+#endif
+#if CH_USE_WAITEXIT
+ msg_t chThdWait(Thread *tp);
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @brief Returns a pointer to the current @p Thread.
+ */
+#define chThdSelf() currp
+
+/**
+ * @brief Returns the current thread priority.
+ */
+#define chThdGetPriority() (currp->p_prio)
+
+/**
+ * @brief Returns the pointer to the @p Thread local storage area, if any.
+ */
+#define chThdLS() (void *)(currp + 1)
+
+/**
+ * @brief Verifies if the specified thread is in the @p THD_STATE_FINAL state.
+ *
+ * @param[in] tp the pointer to the thread
+ * @retval TRUE thread terminated.
+ * @retval FALSE thread not terminated.
+ */
+#define chThdTerminated(tp) ((tp)->p_state == THD_STATE_FINAL)
+
+/**
+ * @brief Verifies if the current thread has a termination request pending.
+ *
+ * @retval TRUE termination request pended.
+ * @retval FALSE termination request not pended.
+ */
+#define chThdShouldTerminate() (currp->p_flags & THD_TERMINATE)
+
+/**
+ * @brief Resumes a thread created with @p chThdInit().
+ *
+ * @param[in] tp the pointer to the thread
+ */
+#define chThdResumeI(tp) chSchReadyI(tp)
+
+/**
+ * @brief Suspends the invoking thread for the specified time.
+ *
+ * @param[in] time the delay in system ticks, the special values are
+ * handled as follow:
+ * - @a TIME_INFINITE the thread enters an infinite sleep
+ * state.
+ * - @a TIME_IMMEDIATE this value is accepted but
+ * interpreted as a normal time specification not as
+ * an immediate timeout specification.
+ * .
+ */
+#define chThdSleepS(time) chSchGoSleepTimeoutS(THD_STATE_SLEEPING, time)
+
+/**
+ * @brief Delays the invoking thread for the specified number of seconds.
+ * @note The specified time is rounded up to a value allowed by the real
+ * system clock.
+ * @note The maximum specified value is implementation dependent.
+ *
+ * @param[in] sec the time in seconds
+ */
+#define chThdSleepSeconds(sec) chThdSleep(S2ST(sec))
+
+/**
+ * @brief Delays the invoking thread for the specified number of
+ * milliseconds.
+ * @note The specified time is rounded up to a value allowed by the real
+ * system clock.
+ * @note The maximum specified value is implementation dependent.
+ *
+ * @param[in] msec the time in milliseconds
+ */
+#define chThdSleepMilliseconds(msec) chThdSleep(MS2ST(msec))
+
+/**
+ * @brief Delays the invoking thread for the specified number of
+ * microseconds.
+ * @note The specified time is rounded up to a value allowed by the real
+ * system clock.
+ * @note The maximum specified value is implementation dependent.
+ *
+ * @param[in] usec the time in microseconds
+ */
+#define chThdSleepMicroseconds(usec) chThdSleep(US2ST(usec))
+
+#endif /* _THREADS_H_ */
+
+/** @} */
diff --git a/os/kernel/include/vt.h b/os/kernel/include/vt.h index 23396e594..445650332 100644 --- a/os/kernel/include/vt.h +++ b/os/kernel/include/vt.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
@@ -55,7 +55,7 @@ typedef void (*vtfunc_t)(void *);
/**
- * @brief Virtual Timer structure type. + * @brief Virtual Timer structure type.
*/
typedef struct VirtualTimer VirtualTimer;
@@ -94,7 +94,7 @@ typedef struct { extern VTList vtlist;
/**
- * @brief Virtual timers sticker. + * @brief Virtual timers sticker.
*/
#define chVTDoTickI() { \
vtlist.vt_systime++; \
|