From 3547c3916175d387a43c6d3a36330550b1d278d5 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 25 Oct 2008 10:35:10 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@482 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/chdelta.c | 90 ---------------------------------- src/chsleep.c | 50 ------------------- src/chthreads.c | 11 +++++ src/chvt.c | 102 ++++++++++++++++++++++++++++++++++++++ src/include/ch.h | 3 +- src/include/delta.h | 105 --------------------------------------- src/include/sleep.h | 75 ---------------------------- src/include/threads.h | 14 +++++- src/include/vt.h | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/kernel.mk | 7 ++- 10 files changed, 262 insertions(+), 327 deletions(-) delete mode 100644 src/chdelta.c delete mode 100644 src/chsleep.c create mode 100644 src/chvt.c delete mode 100644 src/include/delta.h delete mode 100644 src/include/sleep.h create mode 100644 src/include/vt.h (limited to 'src') diff --git a/src/chdelta.c b/src/chdelta.c deleted file mode 100644 index ec654907c..000000000 --- a/src/chdelta.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - 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 VirtualTimers - * @{ - */ - -#include - -DeltaList dlist; - -/** - * Virtual Timers initialization. - * @note Internal use only. - */ -void chVTInit(void) { - - dlist.dl_next = dlist.dl_prev = (void *)&dlist; - dlist.dl_dtime = (systime_t)-1; - dlist.dl_stime = 0; -} - -/** - * Enables a virtual timer. - * @param vtp the \p VirtualTimer structure pointer - * @param time the number of time ticks, the value zero is allowed with - * meaning "infinite". In this case the structure is initialized - * but not inserted in the delta list, the timer will never be - * triggered. - * @param vtfunc the timer callback function. After invoking the callback - * the timer is disabled and the structure can be disposed or - * reused. - * @param par a parameter that will be passed to the callback function - * @note Must be called with the interrupts disabled. - * @note The associated function is invoked by an interrupt handler. - */ -void chVTSetI(VirtualTimer *vtp, systime_t time, vtfunc_t vtfunc, void *par) { - - vtp->vt_par = par; - vtp->vt_func = vtfunc; - if (time) { - VirtualTimer *p = dlist.dl_next; - while (p->vt_dtime < time) { - time -= p->vt_dtime; - p = p->vt_next; - } - - vtp->vt_prev = (vtp->vt_next = p)->vt_prev; - vtp->vt_prev->vt_next = p->vt_prev = vtp; - vtp->vt_dtime = time; - if (p != (void *)&dlist) - p->vt_dtime -= time; - } - else - vtp->vt_next = vtp->vt_prev = vtp; // Allows a chVTResetI() on the fake timer. -} - -/** - * Disables a Virtual Timer. - * @param vtp the \p VirtualTimer structure pointer - * @note It must be called with the interrupts disabled. - * @note The timer MUST be active when this function is invoked. - */ -void chVTResetI(VirtualTimer *vtp) { - - if (vtp->vt_next != (void *)&dlist) - vtp->vt_next->vt_dtime += vtp->vt_dtime; - vtp->vt_prev->vt_next = vtp->vt_next; - vtp->vt_next->vt_prev = vtp->vt_prev; - vtp->vt_func = 0; -} - -/** @} */ diff --git a/src/chsleep.c b/src/chsleep.c deleted file mode 100644 index 7bf805471..000000000 --- a/src/chsleep.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - 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 Time - * @{ - */ - -#include - -/** - * Suspends the invoking thread for the specified time. - * @param time the system ticks number - */ -void chThdSleep(systime_t time) { - - chSysLock(); - chSchGoSleepTimeoutS(PRSLEEP, time); - chSysUnlock(); -} - -/** - * Checks if the current system time is within the specified time window. - * @param start the start of the time window (inclusive) - * @param end the end of the time window (non inclusive) - */ -bool_t chSysInTimeWindow(systime_t start, systime_t end) { - - systime_t time = chSysGetTime(); - return end >= start ? (time >= start) && (time < end) : - (time >= start) || (time < end); -} - -/** @} */ diff --git a/src/chthreads.c b/src/chthreads.c index 58df0a5c1..11d2442ad 100644 --- a/src/chthreads.c +++ b/src/chthreads.c @@ -287,6 +287,17 @@ void chThdTerminate(Thread *tp) { chSysUnlock(); } +/** + * Suspends the invoking thread for the specified time. + * @param time the system ticks number + */ +void chThdSleep(systime_t time) { + + chSysLock(); + chSchGoSleepTimeoutS(PRSLEEP, time); + chSysUnlock(); +} + /** * Terminates the current thread by specifying an exit status code. * diff --git a/src/chvt.c b/src/chvt.c new file mode 100644 index 000000000..77978e16c --- /dev/null +++ b/src/chvt.c @@ -0,0 +1,102 @@ +/* + 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 VirtualTimers + * @{ + */ + +#include + +VTList vtlist; + +/** + * Virtual Timers initialization. + * @note Internal use only. + */ +void chVTInit(void) { + + vtlist.vt_next = vtlist.vt_prev = (void *)&vtlist; + vtlist.vt_time = (systime_t)-1; + vtlist.vt_systime = 0; +} + +/** + * Enables a virtual timer. + * @param vtp the \p VirtualTimer structure pointer + * @param time the number of time ticks, the value zero is allowed with + * meaning "infinite". In this case the structure is initialized + * but not inserted in the delta list, the timer will never be + * triggered. + * @param vtfunc the timer callback function. After invoking the callback + * the timer is disabled and the structure can be disposed or + * reused. + * @param par a parameter that will be passed to the callback function + * @note Must be called with the interrupts disabled. + * @note The associated function is invoked by an interrupt handler. + */ +void chVTSetI(VirtualTimer *vtp, systime_t time, vtfunc_t vtfunc, void *par) { + + vtp->vt_par = par; + vtp->vt_func = vtfunc; + if (time) { + VirtualTimer *p = vtlist.vt_next; + while (p->vt_time < time) { + time -= p->vt_time; + p = p->vt_next; + } + + vtp->vt_prev = (vtp->vt_next = p)->vt_prev; + vtp->vt_prev->vt_next = p->vt_prev = vtp; + vtp->vt_time = time; + if (p != (void *)&vtlist) + p->vt_time -= time; + } + else + vtp->vt_next = vtp->vt_prev = vtp; // Allows a chVTResetI() on the fake timer. +} + +/** + * Disables a Virtual Timer. + * @param vtp the \p VirtualTimer structure pointer + * @note It must be called with the interrupts disabled. + * @note The timer MUST be active when this function is invoked. + */ +void chVTResetI(VirtualTimer *vtp) { + + if (vtp->vt_next != (void *)&vtlist) + vtp->vt_next->vt_time += vtp->vt_time; + vtp->vt_prev->vt_next = vtp->vt_next; + vtp->vt_next->vt_prev = vtp->vt_prev; + vtp->vt_func = 0; +} + +/** + * Checks if the current system time is within the specified time window. + * @param start the start of the time window (inclusive) + * @param end the end of the time window (non inclusive) + */ +bool_t chSysInTimeWindow(systime_t start, systime_t end) { + + systime_t time = chSysGetTime(); + return end >= start ? (time >= start) && (time < end) : + (time >= start) || (time < end); +} + +/** @} */ diff --git a/src/include/ch.h b/src/include/ch.h index 0ccb42455..28a3b1bd8 100644 --- a/src/include/ch.h +++ b/src/include/ch.h @@ -31,7 +31,7 @@ #include #include "lists.h" #include -#include "delta.h" +#include "vt.h" #include "scheduler.h" #include "semaphores.h" #include "mutexes.h" @@ -41,7 +41,6 @@ #include "mempools.h" #include "threads.h" #include "inline.h" -#include "sleep.h" #include "queues.h" #include "serial.h" #include "debug.h" diff --git a/src/include/delta.h b/src/include/delta.h deleted file mode 100644 index 4d1c9ac23..000000000 --- a/src/include/delta.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - 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 VirtualTimers - * @{ - */ - -#ifndef _DELTA_H_ -#define _DELTA_H_ - -/** Virtual Timer callback function.*/ -typedef void (*vtfunc_t)(void *); - -typedef struct VirtualTimer VirtualTimer; - -/** - * Virtual Timer descriptor structure. - * @extends DeltaList - */ -struct VirtualTimer { - /** Next timer in the delta list.*/ - VirtualTimer *vt_next; - /** Previous timer in the delta list.*/ - VirtualTimer *vt_prev; - /** Time delta before timeout.*/ - systime_t vt_dtime; - /** Timer callback function pointer. The pointer is reset to zero after - the callback is invoked.*/ - vtfunc_t vt_func; - /** Timer callback function parameter.*/ - void *vt_par; -}; - -/** - * Delta List header. - * @note The delta 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 { - /** Next timer in the list (the one that will be triggered next).*/ - VirtualTimer *dl_next; - /** Last timer in the list.*/ - VirtualTimer *dl_prev; - /** Not used but it must be set to -1.*/ - systime_t dl_dtime; - volatile systime_t dl_stime; -} DeltaList; - -extern DeltaList dlist; - -#define chVTDoTickI() { \ - dlist.dl_stime++; \ - if (&dlist != (DeltaList *)dlist.dl_next) { \ - VirtualTimer *vtp; \ - \ - --dlist.dl_next->vt_dtime; \ - while (!(vtp = dlist.dl_next)->vt_dtime) { \ - vtfunc_t fn = vtp->vt_func; \ - vtp->vt_func = NULL; \ - (vtp->vt_next->vt_prev = (void *)&dlist)->vt_next = vtp->vt_next; \ - fn(vtp->vt_par); \ - } \ - } \ -} - -/** Infinite time specification.*/ -#define TIME_INFINITE 0 - -/* - * Virtual Timers APIs. - */ -#ifdef __cplusplus -extern "C" { -#endif - void chVTInit(void); - void chVTSetI(VirtualTimer *vtp, systime_t time, vtfunc_t vtfunc, void *par); - void chVTResetI(VirtualTimer *vtp); -#ifdef __cplusplus -} -#endif - -/** Returns TRUE if the speciified timer is armed.*/ -#define chVTIsArmedI(vtp) ((vtp)->vt_func != NULL) - -#endif /* _DELTA_H_ */ - -/** @} */ diff --git a/src/include/sleep.h b/src/include/sleep.h deleted file mode 100644 index faed26109..000000000 --- a/src/include/sleep.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - 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 Time - * @{ - */ - -#ifndef _SLEEP_H_ -#define _SLEEP_H_ - -/** - * Time conversion utility. Converts from seconds to system ticks number. - */ -#define S2ST(sec) ((systime_t)((sec) * CH_FREQUENCY)) - -/** - * Time conversion utility. Converts from milliseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - */ -#define MS2ST(msec) ((systime_t)(((((msec) - 1L) * CH_FREQUENCY) / 1000) + 1)) - -/** - * Time conversion utility. Converts from microseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - */ -#define US2ST(usec) ((systime_t)(((((usec) - 1L) * CH_FREQUENCY) / 1000000) + 1)) - -#ifdef __cplusplus -extern "C" { -#endif - void chThdSleep(systime_t time); - bool_t chSysInTimeWindow(systime_t start, systime_t end); -#ifdef __cplusplus -} -#endif - -/** - * Returns the number of system ticks since the \p chSysInit() invocation. - * @return the system ticks number - * @note The counter can reach its maximum and then returns to zero. - * @note This function is designed to work with the \p chThdSleepUntil(). - */ -#define chSysGetTime() dlist.dl_stime - -/** - * Suspends the invoking thread until the system time arrives to the specified - * value. - */ -#define chThdSleepUntil(t) { \ - chSysLock(); \ - chSchGoSleepTimeoutS(PRSLEEP, \ - (systime_t)((t) - chSysGetTime())); \ - chSysUnlock(); \ -} - -#endif /* _SLEEP_H_ */ - -/** @} */ diff --git a/src/include/threads.h b/src/include/threads.h index 051ca482d..e9894650d 100644 --- a/src/include/threads.h +++ b/src/include/threads.h @@ -189,10 +189,11 @@ extern "C" { Thread *chThdCreate(tprio_t prio, tmode_t mode, void *workspace, size_t wsize, tfunc_t pf, void *arg); void chThdSetPriority(tprio_t newprio); - void chThdExit(msg_t msg); Thread *chThdResume(Thread *tp); void chThdSuspend(Thread **tpp); void chThdTerminate(Thread *tp); + void chThdSleep(systime_t time); + void chThdExit(msg_t msg); #ifdef CH_USE_WAITEXIT msg_t chThdWait(Thread *tp); #endif @@ -266,6 +267,17 @@ extern "C" { #define chThdCreateFast(prio, workspace, wsize, pf) \ chThdCreateStatic(workspace, wsize, prio, pf, NULL) +/** + * Suspends the invoking thread until the system time arrives to the specified + * value. + */ +#define chThdSleepUntil(t) { \ + chSysLock(); \ + chSchGoSleepTimeoutS(PRSLEEP, \ + (systime_t)((t) - chSysGetTime())); \ + chSysUnlock(); \ +} + #endif /* _THREADS_H_ */ /** @} */ diff --git a/src/include/vt.h b/src/include/vt.h new file mode 100644 index 000000000..954c87da5 --- /dev/null +++ b/src/include/vt.h @@ -0,0 +1,132 @@ +/* + 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 Time + * @{ + */ + +#ifndef _VT_H_ +#define _VT_H_ + +/** + * Time conversion utility. Converts from seconds to system ticks number. + */ +#define S2ST(sec) ((systime_t)((sec) * CH_FREQUENCY)) + +/** + * Time conversion utility. Converts from milliseconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + */ +#define MS2ST(msec) ((systime_t)(((((msec) - 1L) * CH_FREQUENCY) / 1000) + 1)) + +/** + * Time conversion utility. Converts from microseconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + */ +#define US2ST(usec) ((systime_t)(((((usec) - 1L) * CH_FREQUENCY) / 1000000) + 1)) + +/** Virtual Timer callback function.*/ +typedef void (*vtfunc_t)(void *); + +typedef struct VirtualTimer VirtualTimer; + +/** + * Virtual Timer descriptor structure. + * @extends DeltaList + */ +struct VirtualTimer { + /** Next timer in the delta list.*/ + VirtualTimer *vt_next; + /** Previous timer in the delta list.*/ + VirtualTimer *vt_prev; + /** Time delta before timeout.*/ + systime_t vt_time; + /** Timer callback function pointer. The pointer is reset to zero after + the callback is invoked.*/ + vtfunc_t vt_func; + /** Timer callback function parameter.*/ + void *vt_par; +}; + +/** + * Delta List header. + * @note The delta 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 { + /** Next timer in the list (the one that will be triggered next).*/ + VirtualTimer *vt_next; + /** Last timer in the list.*/ + VirtualTimer *vt_prev; + /** Not used but it must be set to -1.*/ + systime_t vt_time; + /** System Time counter.*/ + volatile systime_t vt_systime; +} VTList; + +extern VTList vtlist; + +#define chVTDoTickI() { \ + vtlist.vt_systime++; \ + if (&vtlist != (VTList *)vtlist.vt_next) { \ + VirtualTimer *vtp; \ + \ + --vtlist.vt_next->vt_time; \ + while (!(vtp = vtlist.vt_next)->vt_time) { \ + vtfunc_t fn = vtp->vt_func; \ + vtp->vt_func = NULL; \ + (vtp->vt_next->vt_prev = (void *)&vtlist)->vt_next = vtp->vt_next;\ + fn(vtp->vt_par); \ + } \ + } \ +} + +/** Infinite time specification.*/ +#define TIME_INFINITE 0 + +/* + * Virtual Timers APIs. + */ +#ifdef __cplusplus +extern "C" { +#endif + void chVTInit(void); + void chVTSetI(VirtualTimer *vtp, systime_t time, vtfunc_t vtfunc, void *par); + void chVTResetI(VirtualTimer *vtp); + bool_t chSysInTimeWindow(systime_t start, systime_t end); +#ifdef __cplusplus +} +#endif + +/** Returns TRUE if the speciified timer is armed.*/ +#define chVTIsArmedI(vtp) ((vtp)->vt_func != NULL) + +/** + * Returns the number of system ticks since the \p chSysInit() invocation. + * @return the system ticks number + * @note The counter can reach its maximum and then returns to zero. + * @note This function is designed to work with the \p chThdSleepUntil(). + */ +#define chSysGetTime() (vtlist.vt_systime) + +#endif /* _VT_H_ */ + +/** @} */ diff --git a/src/kernel.mk b/src/kernel.mk index 052303e1e..7f6d93fdd 100644 --- a/src/kernel.mk +++ b/src/kernel.mk @@ -1,10 +1,9 @@ # List of all the ChibiOS/RT kernel files, there is no need to remove the files # from this list, you can disable parts of the kernel by editing chconf.h. KERNSRC = ../../src/chinit.c ../../src/chdebug.c \ - ../../src/chlists.c ../../src/chdelta.c \ + ../../src/chlists.c ../../src/chvt.c \ ../../src/chschd.c ../../src/chthreads.c \ ../../src/chsem.c ../../src/chmtx.c \ ../../src/chevents.c ../../src/chmsg.c \ - ../../src/chsleep.c ../../src/chqueues.c \ - ../../src/chserial.c ../../src/chheap.c \ - ../../src/chmempools.c + ../../src/chqueues.c ../../src/chserial.c \ + ../../src/chheap.c ../../src/chmempools.c -- cgit v1.2.3