git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@482 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
902470d1c5
commit
3547c39161
17
docs/ch.txt
17
docs/ch.txt
|
@ -348,20 +348,11 @@
|
|||
/** @} */
|
||||
|
||||
/**
|
||||
* @defgroup VirtualTimers Virtual Timers
|
||||
* @defgroup Time Time and Virtual Timers
|
||||
* @{
|
||||
* Virtual Timers APIs.
|
||||
* @file src/chdelta.c Virtual Timers code.
|
||||
* @file delta.h Virtual Timers macros and structures.
|
||||
*/
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @defgroup Time Time
|
||||
* @{
|
||||
* Time related APIs.
|
||||
* @file include/sleep.h Time macros and structures.
|
||||
* @file chsleep.c Time functions.
|
||||
* Time and Virtual Timers related APIs.
|
||||
* @file include/vt.h Time macros and structures.
|
||||
* @file chvt.c Time functions.
|
||||
*/
|
||||
/** @} */
|
||||
|
||||
|
|
|
@ -74,6 +74,12 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process,
|
|||
*****************************************************************************
|
||||
|
||||
*** 0.7.3 ***
|
||||
- CHANGE: Renamed the files chdelta.c and delta.h to chvt.c and vt.h. All the
|
||||
system time related functions and macros are now moved here.
|
||||
- CHANGE: Removed the files chsleep.c and sleep.h, the content was moved in
|
||||
other files.
|
||||
- CHANGE: Renamed the structure DeltaList to VTList, it includes the system
|
||||
time counter too now.
|
||||
- CHANGE: Removed the CH_USE_SYSTEMTIME and CH_USE_VIRTUAL_TIMER configuration
|
||||
options in order to make the chconf.h file simpler. The related subsystems
|
||||
are almost always required and are now always included.
|
||||
|
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup Time
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include <ch.h>
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/** @} */
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
#include <ch.h>
|
||||
|
||||
DeltaList dlist;
|
||||
VTList vtlist;
|
||||
|
||||
/**
|
||||
* Virtual Timers initialization.
|
||||
|
@ -32,9 +32,9 @@ DeltaList dlist;
|
|||
*/
|
||||
void chVTInit(void) {
|
||||
|
||||
dlist.dl_next = dlist.dl_prev = (void *)&dlist;
|
||||
dlist.dl_dtime = (systime_t)-1;
|
||||
dlist.dl_stime = 0;
|
||||
vtlist.vt_next = vtlist.vt_prev = (void *)&vtlist;
|
||||
vtlist.vt_time = (systime_t)-1;
|
||||
vtlist.vt_systime = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -56,17 +56,17 @@ 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;
|
||||
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_dtime = time;
|
||||
if (p != (void *)&dlist)
|
||||
p->vt_dtime -= time;
|
||||
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.
|
||||
|
@ -80,11 +80,23 @@ void chVTSetI(VirtualTimer *vtp, systime_t time, vtfunc_t vtfunc, void *par) {
|
|||
*/
|
||||
void chVTResetI(VirtualTimer *vtp) {
|
||||
|
||||
if (vtp->vt_next != (void *)&dlist)
|
||||
vtp->vt_next->vt_dtime += vtp->vt_dtime;
|
||||
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);
|
||||
}
|
||||
|
||||
/** @} */
|
|
@ -31,7 +31,7 @@
|
|||
#include <chtypes.h>
|
||||
#include "lists.h"
|
||||
#include <chcore.h>
|
||||
#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"
|
||||
|
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @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_ */
|
||||
|
||||
/** @} */
|
|
@ -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_ */
|
||||
|
||||
/** @} */
|
||||
|
|
|
@ -18,12 +18,29 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup VirtualTimers
|
||||
* @addtogroup Time
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _DELTA_H_
|
||||
#define _DELTA_H_
|
||||
#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 *);
|
||||
|
@ -40,7 +57,7 @@ struct VirtualTimer {
|
|||
/** Previous timer in the delta list.*/
|
||||
VirtualTimer *vt_prev;
|
||||
/** Time delta before timeout.*/
|
||||
systime_t vt_dtime;
|
||||
systime_t vt_time;
|
||||
/** Timer callback function pointer. The pointer is reset to zero after
|
||||
the callback is invoked.*/
|
||||
vtfunc_t vt_func;
|
||||
|
@ -56,26 +73,27 @@ struct VirtualTimer {
|
|||
*/
|
||||
typedef struct {
|
||||
/** Next timer in the list (the one that will be triggered next).*/
|
||||
VirtualTimer *dl_next;
|
||||
VirtualTimer *vt_next;
|
||||
/** Last timer in the list.*/
|
||||
VirtualTimer *dl_prev;
|
||||
VirtualTimer *vt_prev;
|
||||
/** Not used but it must be set to -1.*/
|
||||
systime_t dl_dtime;
|
||||
volatile systime_t dl_stime;
|
||||
} DeltaList;
|
||||
systime_t vt_time;
|
||||
/** System Time counter.*/
|
||||
volatile systime_t vt_systime;
|
||||
} VTList;
|
||||
|
||||
extern DeltaList dlist;
|
||||
extern VTList vtlist;
|
||||
|
||||
#define chVTDoTickI() { \
|
||||
dlist.dl_stime++; \
|
||||
if (&dlist != (DeltaList *)dlist.dl_next) { \
|
||||
vtlist.vt_systime++; \
|
||||
if (&vtlist != (VTList *)vtlist.vt_next) { \
|
||||
VirtualTimer *vtp; \
|
||||
\
|
||||
--dlist.dl_next->vt_dtime; \
|
||||
while (!(vtp = dlist.dl_next)->vt_dtime) { \
|
||||
--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 *)&dlist)->vt_next = vtp->vt_next; \
|
||||
(vtp->vt_next->vt_prev = (void *)&vtlist)->vt_next = vtp->vt_next;\
|
||||
fn(vtp->vt_par); \
|
||||
} \
|
||||
} \
|
||||
|
@ -93,6 +111,7 @@ extern "C" {
|
|||
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
|
||||
|
@ -100,6 +119,14 @@ extern "C" {
|
|||
/** Returns TRUE if the speciified timer is armed.*/
|
||||
#define chVTIsArmedI(vtp) ((vtp)->vt_func != NULL)
|
||||
|
||||
#endif /* _DELTA_H_ */
|
||||
/**
|
||||
* 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_ */
|
||||
|
||||
/** @} */
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue