diff options
Diffstat (limited to 'os/kernel/include/threads.h')
-rw-r--r-- | os/kernel/include/threads.h | 281 |
1 files changed, 169 insertions, 112 deletions
diff --git a/os/kernel/include/threads.h b/os/kernel/include/threads.h index 8a3756cb8..253b220fe 100644 --- a/os/kernel/include/threads.h +++ b/os/kernel/include/threads.h @@ -18,8 +18,9 @@ */ /** - * @file threads.h - * @brief Threads macros and structures. + * @file threads.h + * @brief Threads macros and structures. + * * @addtogroup threads * @{ */ @@ -38,115 +39,168 @@ #endif /** - * @brief Structure representing a thread. - * * @extends ThreadsQueue - * @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. + * + * @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; /**< Next @p Thread in the threads - list/queue. */ + Thread *p_next; /**< @brief Next in the list/queue. */ /* End of the fields shared with the ThreadsList structure. */ - Thread *p_prev; /**< Previous @p Thread in the threads - queue. */ + Thread *p_prev; /**< @brief Previous in the queue. */ /* End of the fields shared with the ThreadsQueue structure. */ - tprio_t p_prio; /**< Thread priority. */ - struct context p_ctx; /**< Processor context. */ + tprio_t p_prio; /**< @brief Thread priority. */ + struct context p_ctx; /**< @brief Processor context. */ #if CH_USE_REGISTRY - Thread *p_newer; /**< Newer registry element. */ - Thread *p_older; /**< Older registry element. */ + 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 - trefs_t p_refs; /**< References to this thread. */ + /** + * @brief References to this thread. + */ + trefs_t p_refs; #endif - tstate_t p_state; /**< Current thread state. */ - tmode_t p_flags; /**< Various thread flags. */ #if CH_USE_NESTED_LOCKS - cnt_t p_locks; /**< Number of nested locks. */ + /** + * @brief Number of nested locks. + */ + cnt_t p_locks; #endif #if CH_DBG_THREADS_PROFILING - volatile systime_t p_time; /**< Thread consumed time in ticks. - @note This field can overflow. */ + /** + * @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 { - msg_t rdymsg; /**< Thread wakeup code. */ - msg_t exitcode; /**< The thread exit code - (@p THD_STATE_FINAL state). */ - void *wtobjp; /**< Generic kernel object pointer. */ + /** + * @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 - eventmask_t ewmask; /**< Enabled events mask - (@p THD_STATE_WTOREVT or - @p THD_STATE_WTANDEVT states). */ + /** + * @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; /**< State-specific fields. */ + } p_u; #if CH_USE_WAITEXIT - ThreadsList p_waiting; /**< Termination waiting list. */ + /** + * @brief Termination waiting list. + */ + ThreadsList p_waiting; #endif #if CH_USE_MESSAGES - ThreadsQueue p_msgqueue; /**< Messages queue. */ - msg_t p_msg; /**< Thread message. */ + /** + * @brief Messages queue. + */ + ThreadsQueue p_msgqueue; + /** + * @brief Thread message. + */ + msg_t p_msg; #endif #if CH_USE_EVENTS - eventmask_t p_epending; /**< Pending events mask. */ + /** + * @brief Pending events mask. + */ + eventmask_t p_epending; #endif #if CH_USE_MUTEXES - Mutex *p_mtxlist; /**< List of the mutexes owned by this - thread, @p NULL terminated. */ - tprio_t p_realprio; /**< Thread's own, non-inherited, - priority. */ + /** + * @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 - void *p_mpool; /**< Memory Pool where the thread - workspace is returned. */ + /** + * @brief Memory Pool where the thread workspace is returned. + */ + void *p_mpool; #endif - /* Extra fields defined in chconf.h */ + /* Extra fields defined in chconf.h.*/ THREAD_EXT_FIELDS }; -/** Thread state: Ready to run, waiting on the ready list.*/ -#define THD_STATE_READY 0 -/** Thread state: Currently running.*/ -#define THD_STATE_CURRENT 1 -/** Thread state: Thread created in suspended state.*/ -#define THD_STATE_SUSPENDED 2 -/** Thread state: Waiting on a semaphore.*/ -#define THD_STATE_WTSEM 3 -/** Thread state: Waiting on a mutex.*/ -#define THD_STATE_WTMTX 4 -/** Thread state: Waiting in @p chCondWait().*/ -#define THD_STATE_WTCOND 5 -/** Thread state: Waiting in @p chThdSleep() or @p chThdSleepUntil().*/ -#define THD_STATE_SLEEPING 6 -/** Thread state: Waiting in @p chThdWait().*/ -#define THD_STATE_WTEXIT 7 -/** Thread state: Waiting in @p chEvtWaitOneTimeout() or - @p chEvtWaitAnyTimeout().*/ -#define THD_STATE_WTOREVT 8 -/** Thread state: Waiting in @p chEvtWaitAllTimeout().*/ -#define THD_STATE_WTANDEVT 9 -/** Thread state: Waiting in @p chMsgSend().*/ -#define THD_STATE_SNDMSG 10 -/** Thread state: Waiting in @p chMsgWait().*/ -#define THD_STATE_WTMSG 11 -/** Thread state: After termination.*/ -#define THD_STATE_FINAL 12 +/** @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 /**< Thread memory mode mask. */ -#define THD_MEM_MODE_STATIC 0 /**< Thread memory mode: static.*/ -#define THD_MEM_MODE_HEAP 1 /**< Thread memory mode: heap. */ -#define THD_MEM_MODE_MEMPOOL 2 /**< Thread memory mode: pool. */ -#define THD_TERMINATE 4 /**< Termination requested. */ - -/* Not an API, don't use into the application code.*/ -Thread *init_thread(Thread *tp, tprio_t prio); +#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. */ -/** Thread function.*/ +/** @brief Thread function.*/ typedef msg_t (*tfunc_t)(void *); /* @@ -155,6 +209,7 @@ typedef msg_t (*tfunc_t)(void *); #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, @@ -186,85 +241,87 @@ extern "C" { #endif /** - * Returns a pointer to the current @p Thread. + * @brief Returns a pointer to the current @p Thread. */ #define chThdSelf() currp /** - * Returns the current thread priority. + * @brief Returns the current thread priority. */ #define chThdGetPriority() (currp->p_prio) /** - * Returns the pointer to the @p Thread local storage area, if any. + * @brief Returns the pointer to the @p Thread local storage area, if any. */ #define chThdLS() (void *)(currp + 1) /** - * Verifies if the specified thread is in the @p THD_STATE_FINAL state. + * @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. + * @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) /** - * Verifies if the current thread has a termination request pending. + * @brief Verifies if the current thread has a termination request pending. * - * @retval TRUE termination request pended. - * @retval FALSE termination request not pended. + * @retval TRUE termination request pended. + * @retval FALSE termination request not pended. */ #define chThdShouldTerminate() (currp->p_flags & THD_TERMINATE) /** - * Resumes a thread created with @p chThdInit(). + * @brief Resumes a thread created with @p chThdInit(). * - * @param[in] tp the pointer to the thread + * @param[in] tp the pointer to the thread */ #define chThdResumeI(tp) chSchReadyI(tp) /** - * Suspends the invoking thread for the specified time. + * @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. - * . + * @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) /** - * Delays the invoking thread for the specified number of seconds. + * @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 - * @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)) /** - * Delays the invoking thread for the specified number of milliseconds. + * @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 - * @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)) /** - * Delays the invoking thread for the specified number of microseconds. + * @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 - * @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)) |