diff options
Diffstat (limited to 'os/kernel/include')
-rw-r--r-- | os/kernel/include/ch.h | 5 | ||||
-rw-r--r-- | os/kernel/include/chglobal.h | 143 | ||||
-rw-r--r-- | os/kernel/include/chregistry.h | 6 | ||||
-rw-r--r-- | os/kernel/include/chschd.h | 32 | ||||
-rw-r--r-- | os/kernel/include/chthreads.h | 18 | ||||
-rw-r--r-- | os/kernel/include/chvt.h | 56 |
6 files changed, 168 insertions, 92 deletions
diff --git a/os/kernel/include/ch.h b/os/kernel/include/ch.h index d2a29ac0c..a3d475db4 100644 --- a/os/kernel/include/ch.h +++ b/os/kernel/include/ch.h @@ -100,9 +100,9 @@ #endif
/** @} */
-/* Forward declaration of the thread structure, it is used in most
- modules.*/
+/* Forward declarations.*/
typedef struct thread thread_t;
+typedef struct virtual_timer virtual_timer_t;
/* Inclusion of all the kernel sub-headers.*/
#include "chconf.h"
@@ -111,6 +111,7 @@ typedef struct thread thread_t; #include "chcore.h"
#include "chtm.h"
#include "chstats.h"
+#include "chglobal.h"
#include "chsys.h"
#include "chvt.h"
#include "chthreads.h"
diff --git a/os/kernel/include/chglobal.h b/os/kernel/include/chglobal.h new file mode 100644 index 000000000..c8e0ca15b --- /dev/null +++ b/os/kernel/include/chglobal.h @@ -0,0 +1,143 @@ +/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012,2013 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 chglobal.h
+ * @brief Data structures with global scope header.
+ *
+ * @addtogroup global
+ */
+
+#ifndef _CHGLOBAL_H_
+#define _CHGLOBAL_H_
+
+/*===========================================================================*/
+/* Module constants. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module pre-compile time settings. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module data structures and types. */
+/*===========================================================================*/
+
+/**
+ * @brief Generic threads single link list, it works like a stack.
+ */
+typedef struct {
+
+ thread_t *p_next; /**< @brief Next in the list/queue. */
+} threads_list_t;
+
+/**
+ * @extends threads_list_t
+ *
+ * @brief Generic threads bidirectional linked list header and element.
+ */
+typedef struct {
+ thread_t *p_next; /**< @brief Next in the list/queue. */
+ thread_t *p_prev; /**< @brief Previous in the queue. */
+} threads_queue_t;
+
+/**
+ * @extends threads_queue_t
+ *
+ * @brief Ready list header.
+ */
+typedef struct {
+ threads_queue_t r_queue; /**< @brief Threads queue. */
+ tprio_t r_prio; /**< @brief This field must be
+ initialized to zero. */
+ struct context r_ctx; /**< @brief Not used, present because
+ offsets. */
+#if CH_CFG_USE_REGISTRY || defined(__DOXYGEN__)
+ thread_t *r_newer; /**< @brief Newer registry element. */
+ thread_t *r_older; /**< @brief Older registry element. */
+#endif
+ /* End of the fields shared with the thread_t structure.*/
+ thread_t *r_current; /**< @brief The currently running
+ thread. */
+} ready_list_t;
+
+/**
+ * @brief Virtual timers list header.
+ * @note The timers list is implemented as a double link bidirectional list
+ * in order to make the unlink time constant, the reset of a virtual
+ * timer is often used in the code.
+ */
+typedef struct {
+ virtual_timer_t *vt_next; /**< @brief Next timer in the delta
+ list. */
+ virtual_timer_t *vt_prev; /**< @brief Last timer in the delta
+ list. */
+ systime_t vt_delta; /**< @brief Must be initialized to -1. */
+#if CH_CFG_TIMEDELTA == 0 || defined(__DOXYGEN__)
+ volatile systime_t vt_systime; /**< @brief System Time counter. */
+#endif
+#if CH_CFG_TIMEDELTA > 0 || defined(__DOXYGEN__)
+ /**
+ * @brief System time of the last tick event.
+ */
+ systime_t vt_lasttime;/**< @brief System time of the last
+ tick event. */
+#endif
+} virtual_timers_list_t;
+
+/**
+ * @brief System data structure.
+ * @note This structure contain all the data areas used by the OS except
+ * stacks.
+ */
+typedef struct ch_system {
+ /**
+ * @brief Ready list header.
+ */
+ ready_list_t rlist;
+ /**
+ * @brief Virtual timers delta list header.
+ */
+ virtual_timers_list_t vtlist;
+} ch_system_t;
+
+/*===========================================================================*/
+/* Module macros. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+#if !defined(__DOXYGEN__)
+extern ch_system_t ch;
+#endif
+
+/*===========================================================================*/
+/* Module inline functions. */
+/*===========================================================================*/
+
+#endif /* _CHGLOBAL_H_ */
+
+/** @} */
diff --git a/os/kernel/include/chregistry.h b/os/kernel/include/chregistry.h index a8318bc53..e4cbb0d68 100644 --- a/os/kernel/include/chregistry.h +++ b/os/kernel/include/chregistry.h @@ -95,9 +95,9 @@ typedef struct { * @param[in] tp thread to add to the registry
*/
#define REG_INSERT(tp) { \
- (tp)->p_newer = (thread_t *)&rlist; \
- (tp)->p_older = rlist.r_older; \
- (tp)->p_older->p_newer = rlist.r_older = (tp); \
+ (tp)->p_newer = (thread_t *)&ch.rlist; \
+ (tp)->p_older = ch.rlist.r_older; \
+ (tp)->p_older->p_newer = ch.rlist.r_older = (tp); \
}
/*===========================================================================*/
diff --git a/os/kernel/include/chschd.h b/os/kernel/include/chschd.h index 0d12acdf0..248f707c8 100644 --- a/os/kernel/include/chschd.h +++ b/os/kernel/include/chschd.h @@ -87,26 +87,6 @@ /* Module data structures and types. */
/*===========================================================================*/
-/**
- * @extends threads_queue_t
- *
- * @brief Ready list header.
- */
-typedef struct {
- threads_queue_t r_queue; /**< @brief Threads queue. */
- tprio_t r_prio; /**< @brief This field must be
- initialized to zero. */
- struct context r_ctx; /**< @brief Not used, present because
- offsets. */
-#if CH_CFG_USE_REGISTRY || defined(__DOXYGEN__)
- thread_t *r_newer; /**< @brief Newer registry element. */
- thread_t *r_older; /**< @brief Older registry element. */
-#endif
- /* End of the fields shared with the thread_t structure.*/
- thread_t *r_current; /**< @brief The currently running
- thread. */
-} ready_list_t;
-
/*===========================================================================*/
/* Module macros. */
/*===========================================================================*/
@@ -125,7 +105,7 @@ typedef struct { * @note It is forbidden to use this macro in order to change the pointer
* (currp = something), use @p setcurrp() instead.
*/
-#define currp rlist.r_current
+#define currp ch.rlist.r_current
/**
* @brief Current thread pointer change macro.
@@ -140,10 +120,6 @@ typedef struct { /* External declarations. */
/*===========================================================================*/
-#if !defined(__DOXYGEN__)
-extern ready_list_t rlist;
-#endif
-
/*
* Scheduler APIs.
*/
@@ -179,7 +155,7 @@ static inline bool chSchIsRescRequiredI(void) { chDbgCheckClassI();
- return firstprio(&rlist.r_queue) > currp->p_prio;
+ return firstprio(&ch.rlist.r_queue) > currp->p_prio;
}
/**
@@ -193,7 +169,7 @@ static inline bool chSchCanYieldS(void) { chDbgCheckClassI();
- return firstprio(&rlist.r_queue) >= currp->p_prio;
+ return firstprio(&ch.rlist.r_queue) >= currp->p_prio;
}
/**
@@ -219,7 +195,7 @@ static inline void chSchDoYieldS(void) { * @special
*/
static inline void chSchPreemption(void) {
- tprio_t p1 = firstprio(&rlist.r_queue);
+ tprio_t p1 = firstprio(&ch.rlist.r_queue);
tprio_t p2 = currp->p_prio;
#if CH_CFG_TIME_QUANTUM > 0
diff --git a/os/kernel/include/chthreads.h b/os/kernel/include/chthreads.h index 66d000d7e..22f499edf 100644 --- a/os/kernel/include/chthreads.h +++ b/os/kernel/include/chthreads.h @@ -99,24 +99,6 @@ typedef struct mutex mutex_t; #endif
/**
- * @brief Generic threads single link list, it works like a stack.
- */
-typedef struct {
-
- thread_t *p_next; /**< @brief Next in the list/queue. */
-} threads_list_t;
-
-/**
- * @extends threads_list_t
- *
- * @brief Generic threads bidirectional linked list header and element.
- */
-typedef struct {
- thread_t *p_next; /**< @brief Next in the list/queue. */
- thread_t *p_prev; /**< @brief Previous in the queue. */
-} threads_queue_t;
-
-/**
* @extends threads_queue_t
*
* @brief Structure representing a thread.
diff --git a/os/kernel/include/chvt.h b/os/kernel/include/chvt.h index 75823f954..ae1aee316 100644 --- a/os/kernel/include/chvt.h +++ b/os/kernel/include/chvt.h @@ -58,40 +58,16 @@ /*===========================================================================*/
/**
- * @brief Virtual Timer callback function.
+ * @brief Type of a Virtual Timer callback function.
*/
typedef void (*vtfunc_t)(void *);
/**
- * @brief Virtual Timer structure type.
+ * @brief Type of a Virtual Timer structure.
*/
typedef struct virtual_timer virtual_timer_t;
/**
- * @brief Virtual timers list header.
- * @note The timers list is implemented as a double link bidirectional list
- * in order to make the unlink time constant, the reset of a virtual
- * timer is often used in the code.
- */
-typedef struct {
- virtual_timer_t *vt_next; /**< @brief Next timer in the delta
- list. */
- virtual_timer_t *vt_prev; /**< @brief Last timer in the delta
- list. */
- systime_t vt_delta; /**< @brief Must be initialized to -1. */
-#if CH_CFG_TIMEDELTA == 0 || defined(__DOXYGEN__)
- volatile systime_t vt_systime; /**< @brief System Time counter. */
-#endif
-#if CH_CFG_TIMEDELTA > 0 || defined(__DOXYGEN__)
- /**
- * @brief System time of the last tick event.
- */
- systime_t vt_lasttime;/**< @brief System time of the last
- tick event. */
-#endif
-} virtual_timers_list_t;
-
-/**
* @extends virtual_timers_list_t
*
* @brief Virtual Timer descriptor structure.
@@ -160,8 +136,6 @@ struct virtual_timer { /* External declarations. */
/*===========================================================================*/
-extern virtual_timers_list_t vtlist;
-
/*
* Virtual Timers APIs.
*/
@@ -213,7 +187,7 @@ static inline void chVTObjectInit(virtual_timer_t *vtp) { static inline systime_t chVTGetSystemTimeX(void) {
#if CH_CFG_TIMEDELTA == 0
- return vtlist.vt_systime;
+ return ch.vtlist.vt_systime;
#else /* CH_CFG_TIMEDELTA > 0 */
return port_timer_get_time();
#endif /* CH_CFG_TIMEDELTA > 0 */
@@ -381,16 +355,16 @@ static inline void chVTDoTickI(void) { chDbgCheckClassI();
#if CH_CFG_TIMEDELTA == 0
- vtlist.vt_systime++;
- if (&vtlist != (virtual_timers_list_t *)vtlist.vt_next) {
+ ch.vtlist.vt_systime++;
+ if (&ch.vtlist != (virtual_timers_list_t *)ch.vtlist.vt_next) {
virtual_timer_t *vtp;
- --vtlist.vt_next->vt_delta;
- while (!(vtp = vtlist.vt_next)->vt_delta) {
+ --ch.vtlist.vt_next->vt_delta;
+ while (!(vtp = ch.vtlist.vt_next)->vt_delta) {
vtfunc_t fn = vtp->vt_func;
vtp->vt_func = (vtfunc_t)NULL;
- vtp->vt_next->vt_prev = (void *)&vtlist;
- vtlist.vt_next = vtp->vt_next;
+ vtp->vt_next->vt_prev = (void *)&ch.vtlist;
+ ch.vtlist.vt_next = vtp->vt_next;
chSysUnlockFromISR();
fn(vtp->vt_par);
chSysLockFromISR();
@@ -399,20 +373,20 @@ static inline void chVTDoTickI(void) { #else /* CH_CFG_TIMEDELTA > 0 */
virtual_timer_t *vtp;
systime_t now = chVTGetSystemTimeX();
- systime_t delta = now - vtlist.vt_lasttime;
+ systime_t delta = now - ch.vtlist.vt_lasttime;
- while ((vtp = vtlist.vt_next)->vt_delta <= delta) {
+ while ((vtp = ch.vtlist.vt_next)->vt_delta <= delta) {
delta -= vtp->vt_delta;
- vtlist.vt_lasttime += vtp->vt_delta;
+ ch.vtlist.vt_lasttime += vtp->vt_delta;
vtfunc_t fn = vtp->vt_func;
vtp->vt_func = (vtfunc_t)NULL;
- vtp->vt_next->vt_prev = (void *)&vtlist;
- vtlist.vt_next = vtp->vt_next;
+ vtp->vt_next->vt_prev = (void *)&ch.vtlist;
+ ch.vtlist.vt_next = vtp->vt_next;
chSysUnlockFromISR();
fn(vtp->vt_par);
chSysLockFromISR();
}
- if (&vtlist == (virtual_timers_list_t *)vtlist.vt_next) {
+ if (&ch.vtlist == (virtual_timers_list_t *)ch.vtlist.vt_next) {
/* The list is empty, no tick event needed so the alarm timer
is stopped.*/
port_timer_stop_alarm();
|