-- cgit v1.2.3 From 286deccd1280b0d66ccc6d9b2617719582607f0d Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 12 Oct 2017 08:37:47 +0000 Subject: EXPERIMENTAL: Introduced sysinterval_t in RT, now system time and intervals are different types and could have different sizes. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10812 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/RT-STM32F746G-DISCOVERY/Makefile | 2 +- demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h | 12 + ...F746G-DISCOVERY (OpenOCD, Flash and Run).launch | 104 ++--- demos/STM32/RT-STM32F746G-DISCOVERY/main.c | 6 +- os/common/oslib/include/chbsem.h | 12 +- os/common/oslib/include/chfifo.h | 8 +- os/common/oslib/include/chmboxes.h | 12 +- os/common/oslib/include/chmempools.h | 4 +- os/common/oslib/src/chmboxes.c | 12 +- os/common/oslib/src/chmempools.c | 4 +- os/hal/osal/rt/osal.h | 4 +- os/rt/include/ch.h | 19 +- os/rt/include/chcond.h | 4 +- os/rt/include/chevents.h | 6 +- os/rt/include/chschd.h | 2 +- os/rt/include/chsem.h | 4 +- os/rt/include/chsystypes.h | 11 - os/rt/include/chthreads.h | 22 +- os/rt/include/chtime.h | 515 +++++++++++++++++++++ os/rt/include/chvt.h | 277 ----------- os/rt/src/chcond.c | 14 +- os/rt/src/chevents.c | 24 +- os/rt/src/chschd.c | 8 +- os/rt/src/chsem.c | 14 +- os/rt/src/chthreads.c | 17 +- 25 files changed, 682 insertions(+), 435 deletions(-) create mode 100644 os/rt/include/chtime.h diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile index 0273b285d..40b040625 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile @@ -103,7 +103,7 @@ include $(CHIBIOS)/os/hal/osal/rt/osal.mk include $(CHIBIOS)/os/rt/rt.mk include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk # Other files (optional). -include $(CHIBIOS)/test/rt/test.mk +#include $(CHIBIOS)/test/rt/test.mk # Define linker script file here LDSCRIPT= $(STARTUPLD)/STM32F746xG.ld diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h b/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h index 0c2c44ee3..1bda70597 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h @@ -51,6 +51,18 @@ */ #define CH_CFG_ST_FREQUENCY 10000 +/** + * @brief Time intervals data size. + * @note Allowed values are 16, 32 or 64 bits. + */ +#define CH_CFG_INTERVALS_SIZE 32 + +/** + * @brief Time types data size. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_TIME_TYPES_SIZE 32 + /** * @brief Time delta constant for the tick-less mode. * @note If this value is zero then the system uses the classic diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch index 4b21ba8fe..05650c142 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch @@ -1,52 +1,52 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/main.c b/demos/STM32/RT-STM32F746G-DISCOVERY/main.c index 6db5cde31..0e62e3604 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/main.c +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/main.c @@ -16,7 +16,7 @@ #include "ch.h" #include "hal.h" -#include "ch_test.h" +//#include "ch_test.h" /* * This is a periodic thread that does absolutely nothing except flashing @@ -71,8 +71,8 @@ int main(void) { * sleeping in a loop and check the button state. */ while (true) { - if (palReadLine(LINE_BUTTON_USER)) - test_execute((BaseSequentialStream *)&SD1); +// if (palReadLine(LINE_BUTTON_USER)) +// test_execute((BaseSequentialStream *)&SD1); chThdSleepMilliseconds(500); } } diff --git a/os/common/oslib/include/chbsem.h b/os/common/oslib/include/chbsem.h index 3a6956017..bf77700d1 100644 --- a/os/common/oslib/include/chbsem.h +++ b/os/common/oslib/include/chbsem.h @@ -166,7 +166,7 @@ static inline msg_t chBSemWaitS(binary_semaphore_t *bsp) { * @brief Wait operation on the binary semaphore. * * @param[in] bsp pointer to a @p binary_semaphore_t structure - * @param[in] time the number of ticks before the operation timeouts, + * @param[in] timeout the number of ticks before the operation timeouts, * the following special values are allowed: * - @a TIME_IMMEDIATE immediate timeout. * - @a TIME_INFINITE no timeout. @@ -182,18 +182,18 @@ static inline msg_t chBSemWaitS(binary_semaphore_t *bsp) { * @sclass */ static inline msg_t chBSemWaitTimeoutS(binary_semaphore_t *bsp, - systime_t time) { + sysinterval_t timeout) { chDbgCheckClassS(); - return chSemWaitTimeoutS(&bsp->sem, time); + return chSemWaitTimeoutS(&bsp->sem, timeout); } /** * @brief Wait operation on the binary semaphore. * * @param[in] bsp pointer to a @p binary_semaphore_t structure - * @param[in] time the number of ticks before the operation timeouts, + * @param[in] timeout the number of ticks before the operation timeouts, * the following special values are allowed: * - @a TIME_IMMEDIATE immediate timeout. * - @a TIME_INFINITE no timeout. @@ -209,9 +209,9 @@ static inline msg_t chBSemWaitTimeoutS(binary_semaphore_t *bsp, * @api */ static inline msg_t chBSemWaitTimeout(binary_semaphore_t *bsp, - systime_t time) { + sysinterval_t timeout) { - return chSemWaitTimeout(&bsp->sem, time); + return chSemWaitTimeout(&bsp->sem, timeout); } /** diff --git a/os/common/oslib/include/chfifo.h b/os/common/oslib/include/chfifo.h index 1df57ef41..78ba16132 100644 --- a/os/common/oslib/include/chfifo.h +++ b/os/common/oslib/include/chfifo.h @@ -164,7 +164,7 @@ static inline void *chFifoTakeObjectI(objects_fifo_t *ofp) { * @sclass */ static inline void *chFifoTakeObjectTimeoutS(objects_fifo_t *ofp, - systime_t timeout) { + sysinterval_t timeout) { return chGuardedPoolAllocTimeoutS(&ofp->free, timeout); } @@ -185,7 +185,7 @@ static inline void *chFifoTakeObjectTimeoutS(objects_fifo_t *ofp, * @api */ static inline void *chFifoTakeObjectTimeout(objects_fifo_t *ofp, - systime_t timeout) { + sysinterval_t timeout) { return chGuardedPoolAllocTimeout(&ofp->free, timeout); } @@ -304,7 +304,7 @@ static inline msg_t chFifoReceiveObjectI(objects_fifo_t *ofp, */ static inline msg_t chFifoReceiveObjectTimeoutS(objects_fifo_t *ofp, void **objpp, - systime_t timeout) { + sysinterval_t timeout) { return chMBFetchTimeoutS(&ofp->mbx, (msg_t *)objpp, timeout); } @@ -327,7 +327,7 @@ static inline msg_t chFifoReceiveObjectTimeoutS(objects_fifo_t *ofp, */ static inline msg_t chFifoReceiveObjectTimeout(objects_fifo_t *ofp, void **objpp, - systime_t timeout) { + sysinterval_t timeout) { return chMBFetchTimeout(&ofp->mbx, (msg_t *)objpp, timeout); } diff --git a/os/common/oslib/include/chmboxes.h b/os/common/oslib/include/chmboxes.h index e6ffd7b82..2c9d09296 100644 --- a/os/common/oslib/include/chmboxes.h +++ b/os/common/oslib/include/chmboxes.h @@ -112,14 +112,14 @@ extern "C" { void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n); void chMBReset(mailbox_t *mbp); void chMBResetI(mailbox_t *mbp); - msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, systime_t timeout); - msg_t chMBPostTimeoutS(mailbox_t *mbp, msg_t msg, systime_t timeout); + msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); + msg_t chMBPostTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); msg_t chMBPostI(mailbox_t *mbp, msg_t msg); - msg_t chMBPostAheadTimeout(mailbox_t *mbp, msg_t msg, systime_t timeout); - msg_t chMBPostAheadTimeoutS(mailbox_t *mbp, msg_t msg, systime_t timeout); + msg_t chMBPostAheadTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); + msg_t chMBPostAheadTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout); msg_t chMBPostAheadI(mailbox_t *mbp, msg_t msg); - msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, systime_t timeout); - msg_t chMBFetchTimeoutS(mailbox_t *mbp, msg_t *msgp, systime_t timeout); + msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout); + msg_t chMBFetchTimeoutS(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout); msg_t chMBFetchI(mailbox_t *mbp, msg_t *msgp); #ifdef __cplusplus } diff --git a/os/common/oslib/include/chmempools.h b/os/common/oslib/include/chmempools.h index 0e9773374..1923404b3 100644 --- a/os/common/oslib/include/chmempools.h +++ b/os/common/oslib/include/chmempools.h @@ -164,9 +164,9 @@ extern "C" { unsigned align); void chGuardedPoolLoadArray(guarded_memory_pool_t *gmp, void *p, size_t n); void *chGuardedPoolAllocTimeoutS(guarded_memory_pool_t *gmp, - systime_t timeout); + sysinterval_t timeout); void *chGuardedPoolAllocTimeout(guarded_memory_pool_t *gmp, - systime_t timeout); + sysinterval_t timeout); void chGuardedPoolFreeI(guarded_memory_pool_t *gmp, void *objp); void chGuardedPoolFree(guarded_memory_pool_t *gmp, void *objp); #endif diff --git a/os/common/oslib/src/chmboxes.c b/os/common/oslib/src/chmboxes.c index 5f2f9b6a3..48b5b4f01 100644 --- a/os/common/oslib/src/chmboxes.c +++ b/os/common/oslib/src/chmboxes.c @@ -162,7 +162,7 @@ void chMBResetI(mailbox_t *mbp) { * * @api */ -msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, systime_t timeout) { +msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout) { msg_t rdymsg; chSysLock(); @@ -191,7 +191,7 @@ msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, systime_t timeout) { * * @sclass */ -msg_t chMBPostTimeoutS(mailbox_t *mbp, msg_t msg, systime_t timeout) { +msg_t chMBPostTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout) { msg_t rdymsg; chDbgCheckClassS(); @@ -287,7 +287,7 @@ msg_t chMBPostI(mailbox_t *mbp, msg_t msg) { * * @api */ -msg_t chMBPostAheadTimeout(mailbox_t *mbp, msg_t msg, systime_t timeout) { +msg_t chMBPostAheadTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout) { msg_t rdymsg; chSysLock(); @@ -316,7 +316,7 @@ msg_t chMBPostAheadTimeout(mailbox_t *mbp, msg_t msg, systime_t timeout) { * * @sclass */ -msg_t chMBPostAheadTimeoutS(mailbox_t *mbp, msg_t msg, systime_t timeout) { +msg_t chMBPostAheadTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout) { msg_t rdymsg; chDbgCheckClassS(); @@ -412,7 +412,7 @@ msg_t chMBPostAheadI(mailbox_t *mbp, msg_t msg) { * * @api */ -msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, systime_t timeout) { +msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout) { msg_t rdymsg; chSysLock(); @@ -441,7 +441,7 @@ msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, systime_t timeout) { * * @sclass */ -msg_t chMBFetchTimeoutS(mailbox_t *mbp, msg_t *msgp, systime_t timeout) { +msg_t chMBFetchTimeoutS(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout) { msg_t rdymsg; chDbgCheckClassS(); diff --git a/os/common/oslib/src/chmempools.c b/os/common/oslib/src/chmempools.c index aec47400c..5e23273f5 100644 --- a/os/common/oslib/src/chmempools.c +++ b/os/common/oslib/src/chmempools.c @@ -268,7 +268,7 @@ void chGuardedPoolLoadArray(guarded_memory_pool_t *gmp, void *p, size_t n) { * @sclass */ void *chGuardedPoolAllocTimeoutS(guarded_memory_pool_t *gmp, - systime_t timeout) { + sysinterval_t timeout) { msg_t msg; msg = chSemWaitTimeoutS(&gmp->sem, timeout); @@ -295,7 +295,7 @@ void *chGuardedPoolAllocTimeoutS(guarded_memory_pool_t *gmp, * @api */ void *chGuardedPoolAllocTimeout(guarded_memory_pool_t *gmp, - systime_t timeout) { + sysinterval_t timeout) { void *p; chSysLock(); diff --git a/os/hal/osal/rt/osal.h b/os/hal/osal/rt/osal.h index c99b4c92a..727cea623 100644 --- a/os/hal/osal/rt/osal.h +++ b/os/hal/osal/rt/osal.h @@ -321,7 +321,7 @@ typedef struct { * * @api */ -#define OSAL_MS2ST(msec) MS2ST(msec) +#define OSAL_MS2ST(msec) TIME_MS2I(msec) /** * @brief Microseconds to system ticks. @@ -333,7 +333,7 @@ typedef struct { * * @api */ -#define OSAL_US2ST(usec) US2ST(usec) +#define OSAL_US2ST(usec) TIME_US2I(usec) /** @} */ /** diff --git a/os/rt/include/ch.h b/os/rt/include/ch.h index e11a049ac..d3bd8217b 100644 --- a/os/rt/include/ch.h +++ b/os/rt/include/ch.h @@ -66,7 +66,7 @@ #define CH_KERNEL_PATCH 0 /** @} */ -/* Core headers.*/ +/* Configuration headers and checks.*/ #include "chtypes.h" #include "chconf.h" @@ -78,12 +78,23 @@ #error "obsolete or unknown configuration file" #endif +/* Early function prototypes required by the following headers.*/ +#ifdef __cplusplus +extern "C" { +#endif + void chSysHalt(const char *reason); +#ifdef __cplusplus +} +#endif + +/* Including everything else.*/ #include "chlicense.h" #include "chchecks.h" #include "chsystypes.h" +#include "chdebug.h" +#include "chtime.h" #include "chalign.h" #include "chcore.h" -#include "chdebug.h" #include "chtrace.h" #include "chtm.h" #include "chstats.h" @@ -108,10 +119,6 @@ #include "chfactory.h" #include "chdynamic.h" -#if !defined(_CHIBIOS_RT_CONF_) -#error "missing or wrong configuration file" -#endif - #endif /* CH_H */ /** @} */ diff --git a/os/rt/include/chcond.h b/os/rt/include/chcond.h index bf1e02cd5..9b753f274 100644 --- a/os/rt/include/chcond.h +++ b/os/rt/include/chcond.h @@ -98,8 +98,8 @@ extern "C" { msg_t chCondWait(condition_variable_t *cp); msg_t chCondWaitS(condition_variable_t *cp); #if CH_CFG_USE_CONDVARS_TIMEOUT == TRUE - msg_t chCondWaitTimeout(condition_variable_t *cp, systime_t time); - msg_t chCondWaitTimeoutS(condition_variable_t *cp, systime_t time); + msg_t chCondWaitTimeout(condition_variable_t *cp, sysinterval_t timeout); + msg_t chCondWaitTimeoutS(condition_variable_t *cp, sysinterval_t timeout); #endif #ifdef __cplusplus } diff --git a/os/rt/include/chevents.h b/os/rt/include/chevents.h index 8b14ed112..d155e0e6d 100644 --- a/os/rt/include/chevents.h +++ b/os/rt/include/chevents.h @@ -141,9 +141,9 @@ extern "C" { eventmask_t chEvtWaitAll(eventmask_t events); #endif #if CH_CFG_USE_EVENTS_TIMEOUT == TRUE - eventmask_t chEvtWaitOneTimeout(eventmask_t events, systime_t time); - eventmask_t chEvtWaitAnyTimeout(eventmask_t events, systime_t time); - eventmask_t chEvtWaitAllTimeout(eventmask_t events, systime_t time); + eventmask_t chEvtWaitOneTimeout(eventmask_t events, sysinterval_t timeout); + eventmask_t chEvtWaitAnyTimeout(eventmask_t events, sysinterval_t timeout); + eventmask_t chEvtWaitAllTimeout(eventmask_t events, sysinterval_t timeout); #endif #ifdef __cplusplus } diff --git a/os/rt/include/chschd.h b/os/rt/include/chschd.h index 79ff437a1..7f25279a9 100644 --- a/os/rt/include/chschd.h +++ b/os/rt/include/chschd.h @@ -476,7 +476,7 @@ extern "C" { thread_t *chSchReadyI(thread_t *tp); thread_t *chSchReadyAheadI(thread_t *tp); void chSchGoSleepS(tstate_t newstate); - msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t time); + msg_t chSchGoSleepTimeoutS(tstate_t newstate, sysinterval_t timeout); void chSchWakeupS(thread_t *ntp, msg_t msg); void chSchRescheduleS(void); bool chSchIsPreemptionRequired(void); diff --git a/os/rt/include/chsem.h b/os/rt/include/chsem.h index ef2848b16..d8958eeeb 100644 --- a/os/rt/include/chsem.h +++ b/os/rt/include/chsem.h @@ -93,8 +93,8 @@ extern "C" { void chSemResetI(semaphore_t *sp, cnt_t n); msg_t chSemWait(semaphore_t *sp); msg_t chSemWaitS(semaphore_t *sp); - msg_t chSemWaitTimeout(semaphore_t *sp, systime_t time); - msg_t chSemWaitTimeoutS(semaphore_t *sp, systime_t time); + msg_t chSemWaitTimeout(semaphore_t *sp, sysinterval_t timeout); + msg_t chSemWaitTimeoutS(semaphore_t *sp, sysinterval_t timeout); void chSemSignal(semaphore_t *sp); void chSemSignalI(semaphore_t *sp); void chSemAddCounterI(semaphore_t *sp, cnt_t n); diff --git a/os/rt/include/chsystypes.h b/os/rt/include/chsystypes.h index 527ff2e8b..dac7d297b 100644 --- a/os/rt/include/chsystypes.h +++ b/os/rt/include/chsystypes.h @@ -44,17 +44,6 @@ /* Module data structures and types. */ /*===========================================================================*/ -/** - * @brief Type of system time. - */ -#if (CH_CFG_ST_RESOLUTION == 32) || defined(__DOXYGEN__) -typedef uint32_t systime_t; -#elif CH_CFG_ST_RESOLUTION == 16 -typedef uint16_t systime_t; -#else -#error "invalid CH_CFG_ST_RESOLUTION setting" -#endif - /** * @extends threads_queue_t * diff --git a/os/rt/include/chthreads.h b/os/rt/include/chthreads.h index 6ac40d3b8..ade7dc30b 100644 --- a/os/rt/include/chthreads.h +++ b/os/rt/include/chthreads.h @@ -190,7 +190,7 @@ typedef struct { * * @api */ -#define chThdSleepSeconds(sec) chThdSleep(S2ST(sec)) +#define chThdSleepSeconds(sec) chThdSleep(TIME_S2I(sec)) /** * @brief Delays the invoking thread for the specified number of @@ -206,7 +206,7 @@ typedef struct { * * @api */ -#define chThdSleepMilliseconds(msec) chThdSleep(MS2ST(msec)) +#define chThdSleepMilliseconds(msec) chThdSleep(TIME_MS2I(msec)) /** * @brief Delays the invoking thread for the specified number of @@ -222,7 +222,7 @@ typedef struct { * * @api */ -#define chThdSleepMicroseconds(usec) chThdSleep(US2ST(usec)) +#define chThdSleepMicroseconds(usec) chThdSleep(TIME_US2I(usec)) /** @} */ /*===========================================================================*/ @@ -255,14 +255,14 @@ extern "C" { tprio_t chThdSetPriority(tprio_t newprio); void chThdTerminate(thread_t *tp); msg_t chThdSuspendS(thread_reference_t *trp); - msg_t chThdSuspendTimeoutS(thread_reference_t *trp, systime_t timeout); + msg_t chThdSuspendTimeoutS(thread_reference_t *trp, sysinterval_t timeout); void chThdResumeI(thread_reference_t *trp, msg_t msg); void chThdResumeS(thread_reference_t *trp, msg_t msg); void chThdResume(thread_reference_t *trp, msg_t msg); - msg_t chThdEnqueueTimeoutS(threads_queue_t *tqp, systime_t timeout); + msg_t chThdEnqueueTimeoutS(threads_queue_t *tqp, sysinterval_t timeout); void chThdDequeueNextI(threads_queue_t *tqp, msg_t msg); void chThdDequeueAllI(threads_queue_t *tqp, msg_t msg); - void chThdSleep(systime_t time); + void chThdSleep(sysinterval_t time); void chThdSleepUntil(systime_t time); systime_t chThdSleepUntilWindowed(systime_t prev, systime_t next); void chThdYield(void); @@ -376,9 +376,9 @@ static inline thread_t *chThdStartI(thread_t *tp) { } /** - * @brief Suspends the invoking thread for the specified time. + * @brief Suspends the invoking thread for the specified number of ticks. * - * @param[in] time the delay in system ticks, the special values are + * @param[in] ticks the delay in system ticks, the special values are * handled as follow: * - @a TIME_INFINITE the thread enters an infinite sleep * state. @@ -387,11 +387,11 @@ static inline thread_t *chThdStartI(thread_t *tp) { * * @sclass */ -static inline void chThdSleepS(systime_t time) { +static inline void chThdSleepS(sysinterval_t ticks) { - chDbgCheck(time != TIME_IMMEDIATE); + chDbgCheck(ticks != TIME_IMMEDIATE); - (void) chSchGoSleepTimeoutS(CH_STATE_SLEEPING, time); + (void) chSchGoSleepTimeoutS(CH_STATE_SLEEPING, ticks); } /** diff --git a/os/rt/include/chtime.h b/os/rt/include/chtime.h new file mode 100644 index 000000000..5a09735eb --- /dev/null +++ b/os/rt/include/chtime.h @@ -0,0 +1,515 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS 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 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 . +*/ + +/** + * @file chtime.h + * @brief Time and intervals macros and structures. + * + * @addtogroup time_intervals + * @{ + */ + +#ifndef CHTIME_H +#define CHTIME_H + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/** + * @name Special time constants + * @{ + */ +/** + * @brief Zero interval specification for some functions with a timeout + * specification. + * @note Not all functions accept @p TIME_IMMEDIATE as timeout parameter, + * see the specific function documentation. + */ +#define TIME_IMMEDIATE ((sysinterval_t)0) + +/** + * @brief Infinite interval specification for all functions with a timeout + * specification. + * @note Not all functions accept @p TIME_INFINITE as timeout parameter, + * see the specific function documentation. + */ +#define TIME_INFINITE ((sysinterval_t)-1) + +/** + * @brief Maximum interval constant usable as timeout. + */ +#define TIME_MAXIMUM ((sysinterval_t)-2) +/** @} */ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16, 32 or 64 bits. + */ +#if !defined(CH_CFG_ST_RESOLUTION) || defined(__DOXYGEN__) +#define CH_CFG_ST_RESOLUTION 32 +#endif + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#if !defined(CH_CFG_ST_FREQUENCY) || defined(__DOXYGEN__) +#define CH_CFG_ST_FREQUENCY 1000 +#endif + +/** + * @brief Time intervals data size. + * @note Allowed values are 16, 32 or 64 bits. + */ +#if !defined(CH_CFG_INTERVALS_SIZE) || defined(__DOXYGEN__) +#define CH_CFG_INTERVALS_SIZE 32 +#endif + +/** + * @brief Time types data size. + * @note Allowed values are 16 or 32 bits. + */ +#if !defined(CH_CFG_TIME_TYPES_SIZE) || defined(__DOXYGEN__) +#define CH_CFG_TIME_TYPES_SIZE 32 +#endif + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if (CH_CFG_ST_RESOLUTION != 16) && (CH_CFG_ST_RESOLUTION != 32) && \ + (CH_CFG_ST_RESOLUTION != 64) +#error "invalid CH_CFG_ST_RESOLUTION specified, must be 16, 32 or 64" +#endif + +#if CH_CFG_ST_FREQUENCY < 10 +#error "invalid CH_CFG_ST_FREQUENCY specified, must be >= 10" +#endif + +#if (CH_CFG_INTERVALS_SIZE != 16) && (CH_CFG_INTERVALS_SIZE != 32) && \ + (CH_CFG_INTERVALS_SIZE != 64) +#error "invalid CH_CFG_INTERVALS_SIZE specified, must be 16, 32 or 64" +#endif + +#if (CH_CFG_TIME_TYPES_SIZE != 16) && (CH_CFG_TIME_TYPES_SIZE != 32) +#error "invalid CH_CFG_TIME_TYPES_SIZE specified, must be 16 or 32" +#endif + +#if CH_CFG_INTERVALS_SIZE < CH_CFG_ST_RESOLUTION +#error "CH_CFG_INTERVALS_SIZE must be >= CH_CFG_ST_RESOLUTION" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of system time. + * @note It is selectable in configuration between 16, 32 or 64 bits + */ +#if (CH_CFG_ST_RESOLUTION == 64) || defined(__DOXYGEN__) +typedef uint64_t systime_t; +#elif CH_CFG_ST_RESOLUTION == 32 +typedef uint32_t systime_t; +#elif CH_CFG_ST_RESOLUTION == 16 +typedef uint16_t systime_t; +#endif + +/** + * @brief Type of time interval. + * @note It is selectable in configuration between 16, 32 or 64 bits + */ +#if (CH_CFG_ST_RESOLUTION == 64) || defined(__DOXYGEN__) +typedef uint64_t sysinterval_t; +#elif CH_CFG_ST_RESOLUTION == 32 +typedef uint32_t sysinterval_t; +#elif CH_CFG_ST_RESOLUTION == 16 +typedef uint16_t sysinterval_t; +#endif + +#if (CH_CFG_TIME_TYPES_SIZE == 32) || defined(__DOXYGEN__) +/** + * @brief Type of seconds. + * @note It is selectable in configuration between 16 or 32 bits + */ +typedef uint32_t time_secs_t; + +/** + * @brief Type of milliseconds. + * @note It is selectable in configuration between 16 or 32 bits + */ +typedef uint32_t time_msecs_t; + +/** + * @brief Type of microseconds. + * @note It is selectable in configuration between 16 or 32 bits + */ +typedef uint32_t time_usecs_t; + +/** + * @brief Type of time conversion variable. + * @note This type must have double width than other time types, it is + * only used internally for conversions. + */ +typedef uint64_t time_conv_t; + +#else +typedef uint16_t time_secs_t; +typedef uint16_t time_msecs_t; +typedef uint16_t time_usecs_t; +typedef uint32_t time_conv_t; +#endif + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + + +/** + * @name Fast time conversion utilities + * @{ + */ +/** + * @brief Seconds to time interval. + * @details Converts from seconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + * @note Use of this macro for large values is not secure because + * integer overflows, make sure your value can be correctly + * converted. + * + * @param[in] secs number of seconds + * @return The number of ticks. + * + * @api + */ +#define TIME_S2I(secs) \ + ((sysinterval_t)((time_conv_t)(secs) * (time_conv_t)CH_CFG_ST_FREQUENCY)) + +/** + * @brief Milliseconds to time interval. + * @details Converts from milliseconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + * @note Use of this macro for large values is not secure because + * integer overflows, make sure your value can be correctly + * converted. + * + * @param[in] msecs number of milliseconds + * @return The number of ticks. + * + * @api + */ +#define TIME_MS2I(msecs) \ + ((sysinterval_t)((((time_conv_t)(msecs) * \ + (time_conv_t)CH_CFG_ST_FREQUENCY) + \ + (time_conv_t)999) / (time_conv_t)1000)) + +/** + * @brief Microseconds to time interval. + * @details Converts from microseconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + * @note Use of this macro for large values is not secure because + * integer overflows, make sure your value can be correctly + * converted. + * + * @param[in] usecs number of microseconds + * @return The number of ticks. + * + * @api + */ +#define TIME_US2I(usecs) \ + ((sysinterval_t)((((time_conv_t)(usecs) * \ + (time_conv_t)CH_CFG_ST_FREQUENCY) + \ + (time_conv_t)999999) / (time_conv_t)1000000)) + +/** + * @brief Time interval to seconds. + * @details Converts from system ticks number to seconds. + * @note The result is rounded up to the next second boundary. + * @note Use of this macro for large values is not secure because + * integer overflows, make sure your value can be correctly + * converted. + * + * @param[in] interval interval in ticks + * @return The number of seconds. + * + * @api + */ +#define TIME_I2S(interval) \ + (time_secs_t)(((time_conv_t)(interval) + \ + (time_conv_t)CH_CFG_ST_FREQUENCY - \ + (time_conv_t)1) / (time_conv_t)CH_CFG_ST_FREQUENCY) + +/** + * @brief Time interval to milliseconds. + * @details Converts from system ticks number to milliseconds. + * @note The result is rounded up to the next millisecond boundary. + * @note Use of this macro for large values is not secure because + * integer overflows, make sure your value can be correctly + * converted. + * + * @param[in] interval interval in ticks + * @return The number of milliseconds. + * + * @api + */ +#define TIME_I2MS(interval) \ + (time_msecs_t)((((time_conv_t)(interval) * (time_conv_t)1000) + \ + (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / \ + (time_conv_t)CH_CFG_ST_FREQUENCY) + +/** + * @brief Time interval to microseconds. + * @details Converts from system ticks number to microseconds. + * @note The result is rounded up to the next microsecond boundary. + * @note Use of this macro for large values is not secure because + * integer overflows, make sure your value can be correctly + * converted. + * + * @param[in] interval interval in ticks + * @return The number of microseconds. + * + * @api + */ +#define TIME_I2US(interval) \ + (time_msecs_t)((((time_conv_t)(interval) * (time_conv_t)1000000) + \ + (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / \ + (time_conv_t)CH_CFG_ST_FREQUENCY) +/** @} */ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +/* + * Virtual Timers APIs. + */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +/** + * @name Secure time conversion utilities + * @{ + */ +/** + * @brief Seconds to time interval. + * @details Converts from seconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + * + * @param[in] sec number of seconds + * @return The number of ticks. + * + * @special + */ +static inline sysinterval_t chTimeS2I(time_secs_t secs) { + time_conv_t ticks; + + ticks = (time_conv_t)secs * (time_conv_t)CH_CFG_ST_FREQUENCY; + + chDbgAssert(ticks <= (time_conv_t)TIME_MAXIMUM, + "conversion overflow"); + + return (sysinterval_t)ticks; +} + +/** + * @brief Milliseconds to time interval. + * @details Converts from milliseconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + * + * @param[in] msec number of milliseconds + * @return The number of ticks. + * + * @special + */ +static inline sysinterval_t chTimeMS2I(time_msecs_t msec) { + time_conv_t ticks; + + ticks = (((time_conv_t)msec * (time_conv_t)CH_CFG_ST_FREQUENCY) + + (time_conv_t)999) / (time_conv_t)1000; + + chDbgAssert(ticks <= (time_conv_t)TIME_MAXIMUM, + "conversion overflow"); + + return (sysinterval_t)ticks; +} + +/** + * @brief Microseconds to time interval. + * @details Converts from microseconds to system ticks number. + * @note The result is rounded upward to the next tick boundary. + * + * @param[in] usec number of microseconds + * @return The number of ticks. + * + * @special + */ +static inline sysinterval_t chTimeUS2I(time_usecs_t usec) { + time_conv_t ticks; + + ticks = (((time_conv_t)usec * (time_conv_t)CH_CFG_ST_FREQUENCY) + + (time_conv_t)999999) / (time_conv_t)1000000; + + chDbgAssert(ticks <= (time_conv_t)TIME_MAXIMUM, + "conversion overflow"); + + return (sysinterval_t)ticks; +} + +/** + * @brief Time interval to seconds. + * @details Converts from system interval to seconds. + * @note The result is rounded up to the next second boundary. + * + * @param[in] interval interval in ticks + * @return The number of seconds. + * + * @special + */ +static inline time_secs_t chTimeI2S(sysinterval_t interval) { + time_conv_t secs; + + secs = ((time_conv_t)interval + + (time_conv_t)CH_CFG_ST_FREQUENCY - + (time_conv_t)1) / (time_conv_t)CH_CFG_ST_FREQUENCY; + + chDbgAssert(secs < (time_conv_t)((time_secs_t)-1), + "conversion overflow"); + + return (time_secs_t)secs; +} + +/** + * @brief Time interval to milliseconds. + * @details Converts from system interval to milliseconds. + * @note The result is rounded up to the next millisecond boundary. + * + * @param[in] interval interval in ticks + * @return The number of milliseconds. + * + * @special + */ +static inline time_msecs_t chTimeI2MS(sysinterval_t interval) { + time_conv_t msecs; + + msecs = (((time_conv_t)interval * (time_conv_t)1000) + + (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / + (time_conv_t)CH_CFG_ST_FREQUENCY; + + chDbgAssert(msecs < (time_conv_t)((time_msecs_t)-1), + "conversion overflow"); + + return (time_msecs_t)msecs; +} + +/** + * @brief Time interval to microseconds. + * @details Converts from system interval to microseconds. + * @note The result is rounded up to the next microsecond boundary. + * + * @param[in] interval interval in ticks + * @return The number of microseconds. + * + * @special + */ +static inline time_usecs_t chTimeI2US(sysinterval_t interval) { + time_conv_t usecs; + + usecs = (((time_conv_t)interval * (time_conv_t)1000000) + + (time_conv_t)CH_CFG_ST_FREQUENCY - (time_conv_t)1) / + (time_conv_t)CH_CFG_ST_FREQUENCY; + + chDbgAssert(usecs <= (time_conv_t)((time_usecs_t)-1), + "conversion overflow"); + + return (time_usecs_t)usecs; +} + +/** + * @brief Adds an interval to a system time returning a system time. + * + * @param[in] systime base system time + * @param[in] interval interval to be added + * @return The new system time. + * + * @xclass + */ +static inline systime_t chTimeAddX(systime_t systime, + sysinterval_t interval) { + + chDbgCheck(interval <= (sysinterval_t)((systime_t)-1)); + + return systime + (systime_t)interval; +} + +/** + * @brief Subtracts two system times returning an interval. + * + * @param[in] start first system time + * @param[in] end second system time + * @return The interval representing the time difference. + * + * @xclass + */ +static inline sysinterval_t chTimeSubtractX(systime_t start, + systime_t end) { + + return (sysinterval_t)(end - start); +} + + +/** + * @brief Checks if the specified time is within the specified time range. + * @note When start==end then the function returns always true because the + * whole time range is specified. + * + * @param[in] time the time to be verified + * @param[in] start the start of the time window (inclusive) + * @param[in] end the end of the time window (non inclusive) + * @retval true current time within the specified time window. + * @retval false current time not within the specified time window. + * + * @xclass + */ +static inline bool chTimeIsInRangeX(systime_t time, + systime_t start, + systime_t end) { + + return (bool)((systime_t)(time - start) < (systime_t)(end - start)); +} + +/** @} */ + +#endif /* CHTIME_H */ + +/** @} */ diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index dc08dbe07..92adaaf7b 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -32,37 +32,6 @@ /* Module constants. */ /*===========================================================================*/ -/** - * @name Special time constants - * @{ - */ -/** - * @brief Zero time specification for some functions 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)0) - -/** - * @brief Infinite time specification for all functions with a timeout - * specification. - * @note Not all functions accept @p TIME_INFINITE as timeout parameter, - * see the specific function documentation. - */ -#define TIME_INFINITE ((systime_t)-1) - -/** - * @brief Maximum time constant. - */ -#define TIME_MAXIMUM ((systime_t)-2) -/** @} */ - -/** - * @brief Maximum unsigned integer. - */ -#define __UINT_MAX ((unsigned int)-1) - /*===========================================================================*/ /* Module pre-compile time settings. */ /*===========================================================================*/ @@ -71,14 +40,6 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if (CH_CFG_ST_RESOLUTION != 16) && (CH_CFG_ST_RESOLUTION != 32) -#error "invalid CH_CFG_ST_RESOLUTION specified, must be 16 or 32" -#endif - -#if CH_CFG_ST_FREQUENCY <= 0 -#error "invalid CH_CFG_ST_FREQUENCY specified, must be greater than zero" -#endif - #if (CH_CFG_ST_TIMEDELTA < 0) || (CH_CFG_ST_TIMEDELTA == 1) #error "invalid CH_CFG_ST_TIMEDELTA specified, must " \ "be zero or greater than one" @@ -100,108 +61,6 @@ /* Module macros. */ /*===========================================================================*/ -/** - * @name Fast time conversion utilities - * @{ - */ -/** - * @brief Seconds to system ticks. - * @details Converts from seconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * @note Use of this macro for large values is not secure because - * integer overflows, make sure your value can be correctly - * converted. - * - * @param[in] sec number of seconds - * @return The number of ticks. - * - * @api - */ -#define S2ST(sec) \ - ((systime_t)((uint32_t)(sec) * (uint32_t)CH_CFG_ST_FREQUENCY)) - -/** - * @brief Milliseconds to system ticks. - * @details Converts from milliseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * @note Use of this macro for large values is not secure because - * integer overflows, make sure your value can be correctly - * converted. - * - * @param[in] msec number of milliseconds - * @return The number of ticks. - * - * @api - */ -#define MS2ST(msec) \ - ((systime_t)(((((uint32_t)(msec)) * \ - ((uint32_t)CH_CFG_ST_FREQUENCY)) + 999UL) / 1000UL)) - -/** - * @brief Microseconds to system ticks. - * @details Converts from microseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * @note Use of this macro for large values is not secure because - * integer overflows, make sure your value can be correctly - * converted. - * - * @param[in] usec number of microseconds - * @return The number of ticks. - * - * @api - */ -#define US2ST(usec) \ - ((systime_t)(((((uint32_t)(usec)) * \ - ((uint32_t)CH_CFG_ST_FREQUENCY)) + 999999UL) / 1000000UL)) - -/** - * @brief System ticks to seconds. - * @details Converts from system ticks number to seconds. - * @note The result is rounded up to the next second boundary. - * @note Use of this macro for large values is not secure because - * integer overflows, make sure your value can be correctly - * converted. - * - * @param[in] n number of system ticks - * @return The number of seconds. - * - * @api - */ -#define ST2S(n) (((n) + CH_CFG_ST_FREQUENCY - 1UL) / CH_CFG_ST_FREQUENCY) - -/** - * @brief System ticks to milliseconds. - * @details Converts from system ticks number to milliseconds. - * @note The result is rounded up to the next millisecond boundary. - * @note Use of this macro for large values is not secure because - * integer overflows, make sure your value can be correctly - * converted. - * - * @param[in] n number of system ticks - * @return The number of milliseconds. - * - * @api - */ -#define ST2MS(n) (((n) * 1000UL + CH_CFG_ST_FREQUENCY - 1UL) / \ - CH_CFG_ST_FREQUENCY) - -/** - * @brief System ticks to microseconds. - * @details Converts from system ticks number to microseconds. - * @note The result is rounded up to the next microsecond boundary. - * @note Use of this macro for large values is not secure because - * integer overflows, make sure your value can be correctly - * converted. - * - * @param[in] n number of system ticks - * @return The number of microseconds. - * - * @api - */ -#define ST2US(n) (((n) * 1000000UL + CH_CFG_ST_FREQUENCY - 1UL) / \ - CH_CFG_ST_FREQUENCY) -/** @} */ - /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ @@ -224,142 +83,6 @@ extern "C" { /* Module inline functions. */ /*===========================================================================*/ -/** - * @name Secure time conversion utilities - * @{ - */ -/** - * @brief Seconds to system ticks. - * @details Converts from seconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * @note This function uses a 64 bits internal representation, - * use with non-constant parameters can lead to inefficient - * code because 64 bits arithmetic would be used at runtime. - * - * @param[in] sec number of seconds - * @return The number of ticks. - * - * @api - */ -static inline systime_t LL_S2ST(unsigned int sec) { - uint64_t ticks = (uint64_t)sec * (uint64_t)CH_CFG_ST_FREQUENCY; - - chDbgAssert(ticks <= (uint64_t)TIME_MAXIMUM, "conversion overflow"); - - return (systime_t)ticks; -} - -/** - * @brief Milliseconds to system ticks. - * @details Converts from milliseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * @note This function uses a 64 bits internal representation, - * use with non-constant parameters can lead to inefficient - * code because 64 bits arithmetic would be used at runtime. - * - * @param[in] msec number of milliseconds - * @return The number of ticks. - * - * @api - */ -static inline systime_t LL_MS2ST(unsigned int msec) { - uint64_t ticks = (((uint64_t)msec * (uint64_t)CH_CFG_ST_FREQUENCY) + 999ULL) - / 1000ULL; - - chDbgAssert(ticks <= (uint64_t)TIME_MAXIMUM, "conversion overflow"); - - return (systime_t)ticks; -} - -/** - * @brief Microseconds to system ticks. - * @details Converts from microseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * @note This function uses a 64 bits internal representation, - * use with non-constant parameters can lead to inefficient - * code because 64 bits arithmetic would be used at runtime. - * - * @param[in] usec number of microseconds - * @return The number of ticks. - * - * @api - */ -static inline systime_t LL_US2ST(unsigned int usec) { - uint64_t ticks = (((uint64_t)usec * (uint64_t)CH_CFG_ST_FREQUENCY) + 999999ULL) - / 1000000ULL; - - chDbgAssert(ticks <= (uint64_t)TIME_MAXIMUM, "conversion overflow"); - - return (systime_t)ticks; -} - -/** - * @brief System ticks to seconds. - * @details Converts from system ticks number to seconds. - * @note The result is rounded up to the next second boundary. - * @note This function uses a 64 bits internal representation, - * use with non-constant parameters can lead to inefficient - * code because 64 bits arithmetic would be used at runtime. - * - * @param[in] n number of system ticks - * @return The number of seconds. - * - * @api - */ -static inline unsigned int LL_ST2S(systime_t n) { - uint64_t sec = ((uint64_t)n + (uint64_t)CH_CFG_ST_FREQUENCY - 1ULL) - / (uint64_t)CH_CFG_ST_FREQUENCY; - - chDbgAssert(sec < (uint64_t)__UINT_MAX, "conversion overflow"); - - return (unsigned int)sec; -} - -/** - * @brief System ticks to milliseconds. - * @details Converts from system ticks number to milliseconds. - * @note The result is rounded up to the next millisecond boundary. - * @note This function uses a 64 bits internal representation, - * use with non-constant parameters can lead to inefficient - * code because 64 bits arithmetic would be used at runtime. - * - * @param[in] n number of system ticks - * @return The number of milliseconds. - * - * @api - */ -static inline unsigned int LL_ST2MS(systime_t n) { - uint64_t msec = (((uint64_t)n * 1000ULL) + (uint64_t)CH_CFG_ST_FREQUENCY - 1ULL) - / (uint64_t)CH_CFG_ST_FREQUENCY; - - chDbgAssert(msec < (uint64_t)__UINT_MAX, "conversion overflow"); - - return (unsigned int)msec; -} - -/** - * @brief System ticks to microseconds. - * @details Converts from system ticks number to microseconds. - * @note The result is rounded up to the next microsecond boundary. - * @note This function uses a 64 bits internal representation, - * use with non-constant parameters can lead to inefficient - * code because 64 bits arithmetic would be used at runtime. - * - * @param[in] n number of system ticks - * @return The number of microseconds. - * - * @api - */ -static inline unsigned int LL_ST2US(systime_t n) { - uint64_t usec = (((uint64_t)n * 1000000ULL) + (uint64_t)CH_CFG_ST_FREQUENCY - 1ULL) - / (uint64_t)CH_CFG_ST_FREQUENCY; - - chDbgAssert(usec < (uint64_t)__UINT_MAX, "conversion overflow"); - - return (unsigned int)usec; -} -/** @} */ - /** * @brief Initializes a @p virtual_timer_t object. * @note Initializing a timer object is not strictly required because diff --git a/os/rt/src/chcond.c b/os/rt/src/chcond.c index cecd2d874..d11ae93bf 100644 --- a/os/rt/src/chcond.c +++ b/os/rt/src/chcond.c @@ -239,7 +239,7 @@ msg_t chCondWaitS(condition_variable_t *cp) { * mutex, the mutex ownership is lost. * * @param[in] cp pointer to the @p condition_variable_t structure - * @param[in] time the number of ticks before the operation timeouts, the + * @param[in] timeout the number of ticks before the operation timeouts, the * special values are handled as follow: * - @a TIME_INFINITE no timeout. * - @a TIME_IMMEDIATE this value is not allowed. @@ -255,11 +255,11 @@ msg_t chCondWaitS(condition_variable_t *cp) { * * @api */ -msg_t chCondWaitTimeout(condition_variable_t *cp, systime_t time) { +msg_t chCondWaitTimeout(condition_variable_t *cp, sysinterval_t timeout) { msg_t msg; chSysLock(); - msg = chCondWaitTimeoutS(cp, time); + msg = chCondWaitTimeoutS(cp, timeout); chSysUnlock(); return msg; @@ -277,7 +277,7 @@ msg_t chCondWaitTimeout(condition_variable_t *cp, systime_t time) { * mutex, the mutex ownership is lost. * * @param[in] cp pointer to the @p condition_variable_t structure - * @param[in] time the number of ticks before the operation timeouts, the + * @param[in] timeout the number of ticks before the operation timeouts, the * special values are handled as follow: * - @a TIME_INFINITE no timeout. * - @a TIME_IMMEDIATE this value is not allowed. @@ -293,12 +293,12 @@ msg_t chCondWaitTimeout(condition_variable_t *cp, systime_t time) { * * @sclass */ -msg_t chCondWaitTimeoutS(condition_variable_t *cp, systime_t time) { +msg_t chCondWaitTimeoutS(condition_variable_t *cp, sysinterval_t timeout) { mutex_t *mp; msg_t msg; chDbgCheckClassS(); - chDbgCheck((cp != NULL) && (time != TIME_IMMEDIATE)); + chDbgCheck((cp != NULL) && (timeout != TIME_IMMEDIATE)); chDbgAssert(currp->mtxlist != NULL, "not owning a mutex"); /* Getting "current" mutex and releasing it.*/ @@ -309,7 +309,7 @@ msg_t chCondWaitTimeoutS(condition_variable_t *cp, systime_t time) { again.*/ currp->u.wtobjp = cp; queue_prio_insert(currp, &cp->queue); - msg = chSchGoSleepTimeoutS(CH_STATE_WTCOND, time); + msg = chSchGoSleepTimeoutS(CH_STATE_WTCOND, timeout); if (msg != MSG_TIMEOUT) { chMtxLockS(mp); } diff --git a/os/rt/src/chevents.c b/os/rt/src/chevents.c index 63740d50b..a4338d70a 100644 --- a/os/rt/src/chevents.c +++ b/os/rt/src/chevents.c @@ -482,7 +482,7 @@ eventmask_t chEvtWaitAll(eventmask_t events) { * * @param[in] events events that the function should wait * for, @p ALL_EVENTS enables all the events - * @param[in] time the number of ticks before the operation timeouts, + * @param[in] timeout the number of ticks before the operation timeouts, * the following special values are allowed: * - @a TIME_IMMEDIATE immediate timeout. * - @a TIME_INFINITE no timeout. @@ -492,19 +492,19 @@ eventmask_t chEvtWaitAll(eventmask_t events) { * * @api */ -eventmask_t chEvtWaitOneTimeout(eventmask_t events, systime_t time) { +eventmask_t chEvtWaitOneTimeout(eventmask_t events, sysinterval_t timeout) { thread_t *ctp = currp; eventmask_t m; chSysLock(); m = ctp->epending & events; if (m == (eventmask_t)0) { - if (TIME_IMMEDIATE == time) { + if (TIME_IMMEDIATE == timeout) { chSysUnlock(); return (eventmask_t)0; } ctp->u.ewmask = events; - if (chSchGoSleepTimeoutS(CH_STATE_WTOREVT, time) < MSG_OK) { + if (chSchGoSleepTimeoutS(CH_STATE_WTOREVT, timeout) < MSG_OK) { chSysUnlock(); return (eventmask_t)0; } @@ -525,7 +525,7 @@ eventmask_t chEvtWaitOneTimeout(eventmask_t events, systime_t time) { * * @param[in] events events that the function should wait * for, @p ALL_EVENTS enables all the events - * @param[in] time the number of ticks before the operation timeouts, + * @param[in] timeout the number of ticks before the operation timeouts, * the following special values are allowed: * - @a TIME_IMMEDIATE immediate timeout. * - @a TIME_INFINITE no timeout. @@ -535,19 +535,19 @@ eventmask_t chEvtWaitOneTimeout(eventmask_t events, systime_t time) { * * @api */ -eventmask_t chEvtWaitAnyTimeout(eventmask_t events, systime_t time) { +eventmask_t chEvtWaitAnyTimeout(eventmask_t events, sysinterval_t timeout) { thread_t *ctp = currp; eventmask_t m; chSysLock(); m = ctp->epending & events; if (m == (eventmask_t)0) { - if (TIME_IMMEDIATE == time) { + if (TIME_IMMEDIATE == timeout) { chSysUnlock(); return (eventmask_t)0; } ctp->u.ewmask = events; - if (chSchGoSleepTimeoutS(CH_STATE_WTOREVT, time) < MSG_OK) { + if (chSchGoSleepTimeoutS(CH_STATE_WTOREVT, timeout) < MSG_OK) { chSysUnlock(); return (eventmask_t)0; } @@ -566,7 +566,7 @@ eventmask_t chEvtWaitAnyTimeout(eventmask_t events, systime_t time) { * * @param[in] events events that the function should wait * for, @p ALL_EVENTS requires all the events - * @param[in] time the number of ticks before the operation timeouts, + * @param[in] timeout the number of ticks before the operation timeouts, * the following special values are allowed: * - @a TIME_IMMEDIATE immediate timeout. * - @a TIME_INFINITE no timeout. @@ -576,17 +576,17 @@ eventmask_t chEvtWaitAnyTimeout(eventmask_t events, systime_t time) { * * @api */ -eventmask_t chEvtWaitAllTimeout(eventmask_t events, systime_t time) { +eventmask_t chEvtWaitAllTimeout(eventmask_t events, sysinterval_t timeout) { thread_t *ctp = currp; chSysLock(); if ((ctp->epending & events) != events) { - if (TIME_IMMEDIATE == time) { + if (TIME_IMMEDIATE == timeout) { chSysUnlock(); return (eventmask_t)0; } ctp->u.ewmask = events; - if (chSchGoSleepTimeoutS(CH_STATE_WTANDEVT, time) < MSG_OK) { + if (chSchGoSleepTimeoutS(CH_STATE_WTANDEVT, timeout) < MSG_OK) { chSysUnlock(); return (eventmask_t)0; } diff --git a/os/rt/src/chschd.c b/os/rt/src/chschd.c index aed9aa8a7..d4bf1cafa 100644 --- a/os/rt/src/chschd.c +++ b/os/rt/src/chschd.c @@ -360,7 +360,7 @@ static void wakeup(void *p) { * @ref thread_states are defined into @p threads.h. * * @param[in] newstate the new thread state - * @param[in] time the number of ticks before the operation timeouts, the + * @param[in] timeout the number of ticks before the operation timeouts, the * special values are handled as follow: * - @a TIME_INFINITE the thread enters an infinite sleep * state, this is equivalent to invoking @@ -372,14 +372,14 @@ static void wakeup(void *p) { * * @sclass */ -msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t time) { +msg_t chSchGoSleepTimeoutS(tstate_t newstate, sysinterval_t timeout) { chDbgCheckClassS(); - if (TIME_INFINITE != time) { + if (TIME_INFINITE != timeout) { virtual_timer_t vt; - chVTDoSetI(&vt, time, wakeup, currp); + chVTDoSetI(&vt, timeout, wakeup, currp); chSchGoSleepS(newstate); if (chVTIsArmedI(&vt)) { chVTDoResetI(&vt); diff --git a/os/rt/src/chsem.c b/os/rt/src/chsem.c index 90df0dd73..c41ff4d78 100644 --- a/os/rt/src/chsem.c +++ b/os/rt/src/chsem.c @@ -217,7 +217,7 @@ msg_t chSemWaitS(semaphore_t *sp) { * @brief Performs a wait operation on a semaphore with timeout specification. * * @param[in] sp pointer to a @p semaphore_t structure - * @param[in] time the number of ticks before the operation timeouts, + * @param[in] timeout the number of ticks before the operation timeouts, * the following special values are allowed: * - @a TIME_IMMEDIATE immediate timeout. * - @a TIME_INFINITE no timeout. @@ -232,11 +232,11 @@ msg_t chSemWaitS(semaphore_t *sp) { * * @api */ -msg_t chSemWaitTimeout(semaphore_t *sp, systime_t time) { +msg_t chSemWaitTimeout(semaphore_t *sp, sysinterval_t timeout) { msg_t msg; chSysLock(); - msg = chSemWaitTimeoutS(sp, time); + msg = chSemWaitTimeoutS(sp, timeout); chSysUnlock(); return msg; @@ -246,7 +246,7 @@ msg_t chSemWaitTimeout(semaphore_t *sp, systime_t time) { * @brief Performs a wait operation on a semaphore with timeout specification. * * @param[in] sp pointer to a @p semaphore_t structure - * @param[in] time the number of ticks before the operation timeouts, + * @param[in] timeout the number of ticks before the operation timeouts, * the following special values are allowed: * - @a TIME_IMMEDIATE immediate timeout. * - @a TIME_INFINITE no timeout. @@ -261,7 +261,7 @@ msg_t chSemWaitTimeout(semaphore_t *sp, systime_t time) { * * @sclass */ -msg_t chSemWaitTimeoutS(semaphore_t *sp, systime_t time) { +msg_t chSemWaitTimeoutS(semaphore_t *sp, sysinterval_t timeout) { chDbgCheckClassS(); chDbgCheck(sp != NULL); @@ -270,7 +270,7 @@ msg_t chSemWaitTimeoutS(semaphore_t *sp, systime_t time) { "inconsistent semaphore"); if (--sp->cnt < (cnt_t)0) { - if (TIME_IMMEDIATE == time) { + if (TIME_IMMEDIATE == timeout) { sp->cnt++; return MSG_TIMEOUT; @@ -278,7 +278,7 @@ msg_t chSemWaitTimeoutS(semaphore_t *sp, systime_t time) { currp->u.wtsemp = sp; sem_insert(currp, &sp->queue); - return chSchGoSleepTimeoutS(CH_STATE_WTSEM, time); + return chSchGoSleepTimeoutS(CH_STATE_WTSEM, timeout); } return MSG_OK; diff --git a/os/rt/src/chthreads.c b/os/rt/src/chthreads.c index 6ca99904b..b462df09f 100644 --- a/os/rt/src/chthreads.c +++ b/os/rt/src/chthreads.c @@ -646,7 +646,7 @@ void chThdTerminate(thread_t *tp) { * * @api */ -void chThdSleep(systime_t time) { +void chThdSleep(sysinterval_t time) { chSysLock(); chThdSleepS(time); @@ -667,11 +667,12 @@ void chThdSleep(systime_t time) { * @api */ void chThdSleepUntil(systime_t time) { + sysinterval_t interval; chSysLock(); - time -= chVTGetSystemTimeX(); - if (time > (systime_t)0) { - chThdSleepS(time); + interval = chTimeSubtractX(time, chVTGetSystemTimeX()); + if (interval > (sysinterval_t)0) { + chThdSleepS(interval); } chSysUnlock(); } @@ -695,8 +696,8 @@ systime_t chThdSleepUntilWindowed(systime_t prev, systime_t next) { chSysLock(); time = chVTGetSystemTimeX(); - if (chVTIsTimeWithinX(time, prev, next)) { - chThdSleepS(next - time); + if (chTimeIsInRangeX(time, prev, next)) { + chThdSleepS(chTimeSubtractX(next, time)); } chSysUnlock(); @@ -758,7 +759,7 @@ msg_t chThdSuspendS(thread_reference_t *trp) { * * @sclass */ -msg_t chThdSuspendTimeoutS(thread_reference_t *trp, systime_t timeout) { +msg_t chThdSuspendTimeoutS(thread_reference_t *trp, sysinterval_t timeout) { thread_t *tp = chThdGetSelfX(); chDbgAssert(*trp == NULL, "not NULL"); @@ -858,7 +859,7 @@ void chThdResume(thread_reference_t *trp, msg_t msg) { * * @sclass */ -msg_t chThdEnqueueTimeoutS(threads_queue_t *tqp, systime_t timeout) { +msg_t chThdEnqueueTimeoutS(threads_queue_t *tqp, sysinterval_t timeout) { if (TIME_IMMEDIATE == timeout) { return MSG_TIMEOUT; -- cgit v1.2.3 From d8b32d7f63c8453135249734f8b542856947e83a Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 12 Oct 2017 12:25:48 +0000 Subject: Rework of virtual timers in RT5, preparation. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10813 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/RT-STM32F746G-DISCOVERY/Makefile | 2 +- ...F746G-DISCOVERY (OpenOCD, Flash and Run).launch | 2 +- ...STM32F746G-DISCOVERY (OpenOCD, Just Run).launch | 2 +- os/hal/osal/rt/osal.h | 2 +- os/rt/include/chschd.h | 4 +- os/rt/include/chtime.h | 3 +- os/rt/include/chvt.h | 62 ++++++++-------------- os/rt/src/chthreads.c | 4 +- os/rt/src/chvt.c | 22 ++++---- 9 files changed, 42 insertions(+), 61 deletions(-) diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile index 40b040625..94853d1b3 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile @@ -5,7 +5,7 @@ # Compiler options here. ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 + USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 endif # C specific options here (added to USE_OPT). diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch index 05650c142..92f436493 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch @@ -33,7 +33,7 @@ - + diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Just Run).launch b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Just Run).launch index 3e12199dc..c64a7eb53 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Just Run).launch +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Just Run).launch @@ -33,7 +33,7 @@ - + diff --git a/os/hal/osal/rt/osal.h b/os/hal/osal/rt/osal.h index 727cea623..07072e88f 100644 --- a/os/hal/osal/rt/osal.h +++ b/os/hal/osal/rt/osal.h @@ -636,7 +636,7 @@ static inline bool osalOsIsTimeWithinX(systime_t time, systime_t start, systime_t end) { - return chVTIsTimeWithinX(time, start, end); + return chTimeIsInRangeX(time, start, end); } /** diff --git a/os/rt/include/chschd.h b/os/rt/include/chschd.h index 7f25279a9..9d3b5dd4e 100644 --- a/os/rt/include/chschd.h +++ b/os/rt/include/chschd.h @@ -325,7 +325,7 @@ struct ch_thread { struct ch_virtual_timer { virtual_timer_t *next; /**< @brief Next timer in the list. */ virtual_timer_t *prev; /**< @brief Previous timer in the list. */ - systime_t delta; /**< @brief Time delta before timeout. */ + sysinterval_t delta; /**< @brief Time delta before timeout. */ vtfunc_t func; /**< @brief Timer callback function pointer. */ void *par; /**< @brief Timer callback function @@ -343,7 +343,7 @@ struct ch_virtual_timers_list { list. */ virtual_timer_t *prev; /**< @brief Last timer in the delta list. */ - systime_t delta; /**< @brief Must be initialized to -1. */ + sysinterval_t delta; /**< @brief Must be initialized to -1. */ #if (CH_CFG_ST_TIMEDELTA == 0) || defined(__DOXYGEN__) volatile systime_t systime; /**< @brief System Time counter. */ #endif diff --git a/os/rt/include/chtime.h b/os/rt/include/chtime.h index 5a09735eb..046cde224 100644 --- a/os/rt/include/chtime.h +++ b/os/rt/include/chtime.h @@ -481,8 +481,7 @@ static inline systime_t chTimeAddX(systime_t systime, * * @xclass */ -static inline sysinterval_t chTimeSubtractX(systime_t start, - systime_t end) { +static inline sysinterval_t chTimeDiffX(systime_t start, systime_t end) { return (sysinterval_t)(end - start); } diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index 92adaaf7b..70a70465e 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -149,30 +149,9 @@ static inline systime_t chVTGetSystemTime(void) { * * @xclass */ -static inline systime_t chVTTimeElapsedSinceX(systime_t start) { +static inline sysinterval_t chVTTimeElapsedSinceX(systime_t start) { - return chVTGetSystemTimeX() - start; -} - -/** - * @brief Checks if the specified time is within the specified time window. - * @note When start==end then the function returns always true because the - * whole time range is specified. - * @note This function can be called from any context. - * - * @param[in] time the time to be verified - * @param[in] start the start of the time window (inclusive) - * @param[in] end the end of the time window (non inclusive) - * @retval true current time within the specified time window. - * @retval false current time not within the specified time window. - * - * @xclass - */ -static inline bool chVTIsTimeWithinX(systime_t time, - systime_t start, - systime_t end) { - - return (bool)((systime_t)(time - start) < (systime_t)(end - start)); + return chTimeDiffX(chVTGetSystemTimeX(), start); } /** @@ -190,7 +169,7 @@ static inline bool chVTIsTimeWithinX(systime_t time, */ static inline bool chVTIsSystemTimeWithinX(systime_t start, systime_t end) { - return chVTIsTimeWithinX(chVTGetSystemTimeX(), start, end); + return chTimeIsInRangeX(chVTGetSystemTimeX(), start, end); } /** @@ -208,7 +187,7 @@ static inline bool chVTIsSystemTimeWithinX(systime_t start, systime_t end) { */ static inline bool chVTIsSystemTimeWithin(systime_t start, systime_t end) { - return chVTIsTimeWithinX(chVTGetSystemTime(), start, end); + return chTimeIsInRangeX(chVTGetSystemTime(), start, end); } /** @@ -227,7 +206,7 @@ static inline bool chVTIsSystemTimeWithin(systime_t start, systime_t end) { * * @iclass */ -static inline bool chVTGetTimersStateI(systime_t *timep) { +static inline bool chVTGetTimersStateI(sysinterval_t *timep) { chDbgCheckClassI(); @@ -239,8 +218,10 @@ static inline bool chVTGetTimersStateI(systime_t *timep) { #if CH_CFG_ST_TIMEDELTA == 0 *timep = ch.vtlist.next->delta; #else - *timep = ch.vtlist.lasttime + ch.vtlist.next->delta + - CH_CFG_ST_TIMEDELTA - chVTGetSystemTimeX(); + *timep = chTimeDiffX(chVTGetSystemTimeX(), + chTimeAddX(ch.vtlist.lasttime, + ch.vtlist.next->delta + + (sysinterval_t)CH_CFG_ST_TIMEDELTA)); #endif } @@ -340,7 +321,7 @@ static inline void chVTReset(virtual_timer_t *vtp) { * * @iclass */ -static inline void chVTSetI(virtual_timer_t *vtp, systime_t delay, +static inline void chVTSetI(virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par) { chVTResetI(vtp); @@ -369,7 +350,7 @@ static inline void chVTSetI(virtual_timer_t *vtp, systime_t delay, * * @api */ -static inline void chVTSet(virtual_timer_t *vtp, systime_t delay, +static inline void chVTSet(virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par) { chSysLock(); @@ -395,7 +376,7 @@ static inline void chVTDoTickI(void) { if (&ch.vtlist != (virtual_timers_list_t *)ch.vtlist.next) { /* The list is not empty, processing elements on top.*/ --ch.vtlist.next->delta; - while (ch.vtlist.next->delta == (systime_t)0) { + while (ch.vtlist.next->delta == (sysinterval_t)0) { virtual_timer_t *vtp; vtfunc_t fn; @@ -411,7 +392,8 @@ static inline void chVTDoTickI(void) { } #else /* CH_CFG_ST_TIMEDELTA > 0 */ virtual_timer_t *vtp; - systime_t now, delta; + systime_t now; + sysinterval_t delta; /* First timer to be processed.*/ vtp = ch.vtlist.next; @@ -421,11 +403,11 @@ static inline void chVTDoTickI(void) { note that the loop is stopped by the timers header having "ch.vtlist.vt_delta == (systime_t)-1" which is greater than all deltas.*/ - while (vtp->delta <= (systime_t)(now - ch.vtlist.lasttime)) { + while (vtp->delta <= chTimeDiffX(ch.vtlist.lasttime, now)) { vtfunc_t fn; /* The "last time" becomes this timer's expiration time.*/ - ch.vtlist.lasttime += vtp->delta; + ch.vtlist.lasttime = chTimeAddX(ch.vtlist.lasttime, vtp->delta); vtp->next->prev = (virtual_timer_t *)&ch.vtlist; ch.vtlist.next = vtp->next; @@ -461,14 +443,14 @@ static inline void chVTDoTickI(void) { } /* Recalculating the next alarm time.*/ - delta = ch.vtlist.lasttime + vtp->delta - now; - if (delta < (systime_t)CH_CFG_ST_TIMEDELTA) { - delta = (systime_t)CH_CFG_ST_TIMEDELTA; + delta = chTimeDiffX(now, chTimeAddX(ch.vtlist.lasttime, vtp->delta)); + if (delta < (sysinterval_t)CH_CFG_ST_TIMEDELTA) { + delta = (sysinterval_t)CH_CFG_ST_TIMEDELTA; } - port_timer_set_alarm(now + delta); + port_timer_set_alarm(chTimeAddX(now, delta)); - chDbgAssert((chVTGetSystemTimeX() - ch.vtlist.lasttime) <= - (now + delta - ch.vtlist.lasttime), + chDbgAssert(chTimeDiffX(ch.vtlist.lasttime, chVTGetSystemTimeX()) <= + chTimeDiffX(ch.vtlist.lasttime, chTimeAddX(now, delta)), "exceeding delta"); #endif /* CH_CFG_ST_TIMEDELTA > 0 */ } diff --git a/os/rt/src/chthreads.c b/os/rt/src/chthreads.c index b462df09f..49abadb2d 100644 --- a/os/rt/src/chthreads.c +++ b/os/rt/src/chthreads.c @@ -670,7 +670,7 @@ void chThdSleepUntil(systime_t time) { sysinterval_t interval; chSysLock(); - interval = chTimeSubtractX(time, chVTGetSystemTimeX()); + interval = chTimeDiffX(time, chVTGetSystemTimeX()); if (interval > (sysinterval_t)0) { chThdSleepS(interval); } @@ -697,7 +697,7 @@ systime_t chThdSleepUntilWindowed(systime_t prev, systime_t next) { chSysLock(); time = chVTGetSystemTimeX(); if (chTimeIsInRangeX(time, prev, next)) { - chThdSleepS(chTimeSubtractX(next, time)); + chThdSleepS(chTimeDiffX(next, time)); } chSysUnlock(); diff --git a/os/rt/src/chvt.c b/os/rt/src/chvt.c index 51db54cc3..4d887b8c4 100644 --- a/os/rt/src/chvt.c +++ b/os/rt/src/chvt.c @@ -62,7 +62,7 @@ void _vt_init(void) { ch.vtlist.next = (virtual_timer_t *)&ch.vtlist; ch.vtlist.prev = (virtual_timer_t *)&ch.vtlist; - ch.vtlist.delta = (systime_t)-1; + ch.vtlist.delta = (sysinterval_t)-1; #if CH_CFG_ST_TIMEDELTA == 0 ch.vtlist.systime = (systime_t)0; #else /* CH_CFG_ST_TIMEDELTA > 0 */ @@ -92,7 +92,7 @@ void _vt_init(void) { * * @iclass */ -void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, +void chVTDoSetI(virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par) { virtual_timer_t *p; systime_t delta; @@ -126,7 +126,7 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, vtp->delta = delay; /* Being the first element in the list the alarm timer is started.*/ - port_timer_start_alarm(ch.vtlist.lasttime + delay); + port_timer_start_alarm(chTimeAddX(ch.vtlist.lasttime, delay)); return; } @@ -136,9 +136,9 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, /* Delay as delta from 'lasttime'. Note, it can overflow and the value becomes lower than 'now'.*/ - delta = now - ch.vtlist.lasttime + delay; + delta = chTimeDiffX(ch.vtlist.lasttime, now) + delay; - if (delta < now - ch.vtlist.lasttime) { + if (delta < chTimeDiffX(ch.vtlist.lasttime, now)) { /* Scenario where a very large delay excedeed the numeric range, it requires a special handling. We need to skip the first element and adjust the delta to wrap back in the previous numeric range.*/ @@ -148,7 +148,7 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, else if (delta < p->delta) { /* A small delay that will become the first element in the delta list and next deadline.*/ - port_timer_set_alarm(ch.vtlist.lasttime + delta); + port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, delta)); } } #else /* CH_CFG_ST_TIMEDELTA == 0 */ @@ -176,7 +176,7 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, /* Special case when the timer is in last position in the list, the value in the header must be restored.*/; p->delta -= delta; - ch.vtlist.delta = (systime_t)-1; + ch.vtlist.delta = (sysinterval_t)-1; } /** @@ -205,9 +205,9 @@ void chVTDoResetI(virtual_timer_t *vtp) { /* The above code changes the value in the header when the removed element is the last of the list, restoring it.*/ - ch.vtlist.delta = (systime_t)-1; + ch.vtlist.delta = (sysinterval_t)-1; #else /* CH_CFG_ST_TIMEDELTA > 0 */ - systime_t nowdelta, delta; + sysinterval_t nowdelta, delta; /* If the timer is not the first of the list then it is simply unlinked else the operation is more complex.*/ @@ -246,7 +246,7 @@ void chVTDoResetI(virtual_timer_t *vtp) { }*/ /* Distance in ticks between the last alarm event and current time.*/ - nowdelta = chVTGetSystemTimeX() - ch.vtlist.lasttime; + nowdelta = chTimeDiffX(ch.vtlist.lasttime, chVTGetSystemTimeX()); /* If the current time surpassed the time of the next element in list then the event interrupt is already pending, just return.*/ @@ -263,7 +263,7 @@ void chVTDoResetI(virtual_timer_t *vtp) { delta = (systime_t)CH_CFG_ST_TIMEDELTA; } - port_timer_set_alarm(ch.vtlist.lasttime + nowdelta + delta); + port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, nowdelta + delta)); #endif /* CH_CFG_ST_TIMEDELTA > 0 */ } -- cgit v1.2.3 From 4d0b8bdf6e8c27242b38f69c0831eb2a0ddb689f Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 12 Oct 2017 13:31:42 +0000 Subject: Added support for "large virtual timers", those allows for intervals greater than the system time capability. To be tested. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10814 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/RT-STM32F746G-DISCOVERY/Makefile | 2 +- os/rt/include/chtime.h | 23 ++++++++++++++--------- os/rt/include/chvt.h | 8 +++++++- os/rt/src/chvt.c | 27 ++++++++++++++++++++++----- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile index 94853d1b3..40b040625 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile @@ -5,7 +5,7 @@ # Compiler options here. ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 + USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 endif # C specific options here (added to USE_OPT). diff --git a/os/rt/include/chtime.h b/os/rt/include/chtime.h index 046cde224..e2e3402ef 100644 --- a/os/rt/include/chtime.h +++ b/os/rt/include/chtime.h @@ -42,7 +42,7 @@ * @note Not all functions accept @p TIME_IMMEDIATE as timeout parameter, * see the specific function documentation. */ -#define TIME_IMMEDIATE ((sysinterval_t)0) +#define TIME_IMMEDIATE ((sysinterval_t)0) /** * @brief Infinite interval specification for all functions with a timeout @@ -50,12 +50,17 @@ * @note Not all functions accept @p TIME_INFINITE as timeout parameter, * see the specific function documentation. */ -#define TIME_INFINITE ((sysinterval_t)-1) +#define TIME_INFINITE ((sysinterval_t)-1) /** * @brief Maximum interval constant usable as timeout. */ -#define TIME_MAXIMUM ((sysinterval_t)-2) +#define TIME_MAX_INTERVAL ((sysinterval_t)-2) + +/** + * @brief Maximum system of system time before it wraps. + */ +#define TIME_MAX_SYSTIME ((systime_t)-1) /** @} */ /*===========================================================================*/ @@ -141,11 +146,11 @@ typedef uint16_t systime_t; * @brief Type of time interval. * @note It is selectable in configuration between 16, 32 or 64 bits */ -#if (CH_CFG_ST_RESOLUTION == 64) || defined(__DOXYGEN__) +#if (CH_CFG_INTERVALS_SIZE == 64) || defined(__DOXYGEN__) typedef uint64_t sysinterval_t; -#elif CH_CFG_ST_RESOLUTION == 32 +#elif CH_CFG_INTERVALS_SIZE == 32 typedef uint32_t sysinterval_t; -#elif CH_CFG_ST_RESOLUTION == 16 +#elif CH_CFG_INTERVALS_SIZE == 16 typedef uint16_t sysinterval_t; #endif @@ -336,7 +341,7 @@ static inline sysinterval_t chTimeS2I(time_secs_t secs) { ticks = (time_conv_t)secs * (time_conv_t)CH_CFG_ST_FREQUENCY; - chDbgAssert(ticks <= (time_conv_t)TIME_MAXIMUM, + chDbgAssert(ticks <= (time_conv_t)TIME_MAX_INTERVAL, "conversion overflow"); return (sysinterval_t)ticks; @@ -358,7 +363,7 @@ static inline sysinterval_t chTimeMS2I(time_msecs_t msec) { ticks = (((time_conv_t)msec * (time_conv_t)CH_CFG_ST_FREQUENCY) + (time_conv_t)999) / (time_conv_t)1000; - chDbgAssert(ticks <= (time_conv_t)TIME_MAXIMUM, + chDbgAssert(ticks <= (time_conv_t)TIME_MAX_INTERVAL, "conversion overflow"); return (sysinterval_t)ticks; @@ -380,7 +385,7 @@ static inline sysinterval_t chTimeUS2I(time_usecs_t usec) { ticks = (((time_conv_t)usec * (time_conv_t)CH_CFG_ST_FREQUENCY) + (time_conv_t)999999) / (time_conv_t)1000000; - chDbgAssert(ticks <= (time_conv_t)TIME_MAXIMUM, + chDbgAssert(ticks <= (time_conv_t)TIME_MAX_INTERVAL, "conversion overflow"); return (sysinterval_t)ticks; diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index 70a70465e..35bd947e0 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -72,7 +72,7 @@ extern "C" { #endif void _vt_init(void); - void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, + void chVTDoSetI(virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par); void chVTDoResetI(virtual_timer_t *vtp); #ifdef __cplusplus @@ -447,6 +447,12 @@ static inline void chVTDoTickI(void) { if (delta < (sysinterval_t)CH_CFG_ST_TIMEDELTA) { delta = (sysinterval_t)CH_CFG_ST_TIMEDELTA; } +#if CH_CFG_INTERVALS_SIZE > CH_CFG_ST_RESOLUTION + /* The delta could be too large for the physical timer to handle.*/ + if (delta > (sysinterval_t)TIME_MAX_SYSTIME) { + delta = (sysinterval_t)TIME_MAX_SYSTIME; + } +#endif port_timer_set_alarm(chTimeAddX(now, delta)); chDbgAssert(chTimeDiffX(ch.vtlist.lasttime, chVTGetSystemTimeX()) <= diff --git a/os/rt/src/chvt.c b/os/rt/src/chvt.c index 4d887b8c4..f627436b4 100644 --- a/os/rt/src/chvt.c +++ b/os/rt/src/chvt.c @@ -146,9 +146,18 @@ void chVTDoSetI(virtual_timer_t *vtp, sysinterval_t delay, p = p->next; } else if (delta < p->delta) { - /* A small delay that will become the first element in the delta list - and next deadline.*/ - port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, delta)); + sysinterval_t deadline_delta; + + /* A small delay that will become the first element in the delta list + and next deadline.*/ + deadline_delta = delta; +#if CH_CFG_INTERVALS_SIZE > CH_CFG_ST_RESOLUTION + /* The delta could be too large for the physical timer to handle.*/ + if (deadline_delta > (sysinterval_t)TIME_MAX_SYSTIME) { + deadline_delta = (sysinterval_t)TIME_MAX_SYSTIME; + } +#endif + port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, deadline_delta)); } } #else /* CH_CFG_ST_TIMEDELTA == 0 */ @@ -207,7 +216,7 @@ void chVTDoResetI(virtual_timer_t *vtp) { is the last of the list, restoring it.*/ ch.vtlist.delta = (sysinterval_t)-1; #else /* CH_CFG_ST_TIMEDELTA > 0 */ - sysinterval_t nowdelta, delta; + sysinterval_t nowdelta, delta, deadline_delta; /* If the timer is not the first of the list then it is simply unlinked else the operation is more complex.*/ @@ -263,7 +272,15 @@ void chVTDoResetI(virtual_timer_t *vtp) { delta = (systime_t)CH_CFG_ST_TIMEDELTA; } - port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, nowdelta + delta)); + /* Next deadline.*/ + deadline_delta = nowdelta + delta; +#if CH_CFG_INTERVALS_SIZE > CH_CFG_ST_RESOLUTION + /* The delta could be too large for the physical timer to handle.*/ + if (deadline_delta > (sysinterval_t)TIME_MAX_SYSTIME) { + deadline_delta = (sysinterval_t)TIME_MAX_SYSTIME; + } +#endif + port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, deadline_delta)); #endif /* CH_CFG_ST_TIMEDELTA > 0 */ } -- cgit v1.2.3 From 750a8f14b696e51b8522cddcf0265775b610dfa1 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 12 Oct 2017 18:50:41 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10815 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- ...F746G-DISCOVERY (OpenOCD, Flash and Run).launch | 104 ++++++++++----------- os/rt/include/chvt.h | 2 +- os/rt/src/chvt.c | 28 +++--- 3 files changed, 67 insertions(+), 67 deletions(-) diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch index 92f436493..620c606b2 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/debug/RT-STM32F746G-DISCOVERY (OpenOCD, Flash and Run).launch @@ -1,52 +1,52 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index 35bd947e0..3dc67f2a3 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -401,7 +401,7 @@ static inline void chVTDoTickI(void) { /* All timers within the time window are triggered and removed, note that the loop is stopped by the timers header having - "ch.vtlist.vt_delta == (systime_t)-1" which is greater than + "ch.vtlist.vt_delta == (sysinterval_t)-1" which is greater than all deltas.*/ while (vtp->delta <= chTimeDiffX(ch.vtlist.lasttime, now)) { vtfunc_t fn; diff --git a/os/rt/src/chvt.c b/os/rt/src/chvt.c index f627436b4..1c5b2fea2 100644 --- a/os/rt/src/chvt.c +++ b/os/rt/src/chvt.c @@ -95,7 +95,7 @@ void _vt_init(void) { void chVTDoSetI(virtual_timer_t *vtp, sysinterval_t delay, vtfunc_t vtfunc, void *par) { virtual_timer_t *p; - systime_t delta; + sysinterval_t delta; chDbgCheckClassI(); chDbgCheck((vtp != NULL) && (vtfunc != NULL) && (delay != TIME_IMMEDIATE)); @@ -109,8 +109,8 @@ void chVTDoSetI(virtual_timer_t *vtp, sysinterval_t delay, /* If the requested delay is lower than the minimum safe delta then it is raised to the minimum safe value.*/ - if (delay < (systime_t)CH_CFG_ST_TIMEDELTA) { - delay = (systime_t)CH_CFG_ST_TIMEDELTA; + if (delay < (sysinterval_t)CH_CFG_ST_TIMEDELTA) { + delay = (sysinterval_t)CH_CFG_ST_TIMEDELTA; } /* Special case where the timers list is empty.*/ @@ -216,7 +216,7 @@ void chVTDoResetI(virtual_timer_t *vtp) { is the last of the list, restoring it.*/ ch.vtlist.delta = (sysinterval_t)-1; #else /* CH_CFG_ST_TIMEDELTA > 0 */ - sysinterval_t nowdelta, delta, deadline_delta; + sysinterval_t nowdelta, delta; /* If the timer is not the first of the list then it is simply unlinked else the operation is more complex.*/ @@ -268,19 +268,19 @@ void chVTDoResetI(virtual_timer_t *vtp) { /* Making sure to not schedule an event closer than CH_CFG_ST_TIMEDELTA ticks from now.*/ - if (delta < (systime_t)CH_CFG_ST_TIMEDELTA) { - delta = (systime_t)CH_CFG_ST_TIMEDELTA; + if (delta < (sysinterval_t)CH_CFG_ST_TIMEDELTA) { + delta = nowdelta + (sysinterval_t)CH_CFG_ST_TIMEDELTA; } - - /* Next deadline.*/ - deadline_delta = nowdelta + delta; + else { + delta = nowdelta + delta; #if CH_CFG_INTERVALS_SIZE > CH_CFG_ST_RESOLUTION - /* The delta could be too large for the physical timer to handle.*/ - if (deadline_delta > (sysinterval_t)TIME_MAX_SYSTIME) { - deadline_delta = (sysinterval_t)TIME_MAX_SYSTIME; - } + /* The delta could be too large for the physical timer to handle.*/ + if (delta > (sysinterval_t)TIME_MAX_SYSTIME) { + delta = (sysinterval_t)TIME_MAX_SYSTIME; + } #endif - port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, deadline_delta)); + } + port_timer_set_alarm(chTimeAddX(ch.vtlist.lasttime, delta)); #endif /* CH_CFG_ST_TIMEDELTA > 0 */ } -- cgit v1.2.3 From 72d563b45f02270fc18bfa61c0c0e7f94325e091 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Fri, 13 Oct 2017 08:52:00 +0000 Subject: Experimental code. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10816 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/RT-STM32F746G-DISCOVERY/Makefile | 2 +- demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h | 2 +- os/rt/include/chvt.h | 27 ++++++++++++++++----------- os/rt/src/chvt.c | 7 +++++++ 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile index 40b040625..94853d1b3 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/Makefile @@ -5,7 +5,7 @@ # Compiler options here. ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 + USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 endif # C specific options here (added to USE_OPT). diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h b/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h index 1bda70597..206f1d11d 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h @@ -49,7 +49,7 @@ * @details Frequency of the system timer that drives the system ticks. This * setting also defines the system tick time unit. */ -#define CH_CFG_ST_FREQUENCY 10000 +#define CH_CFG_ST_FREQUENCY 100000 /** * @brief Time intervals data size. diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index 3dc67f2a3..ea4493df3 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -395,19 +395,26 @@ static inline void chVTDoTickI(void) { systime_t now; sysinterval_t delta; - /* First timer to be processed.*/ + /* Looping through timers.*/ vtp = ch.vtlist.next; - now = chVTGetSystemTimeX(); - - /* All timers within the time window are triggered and removed, - note that the loop is stopped by the timers header having - "ch.vtlist.vt_delta == (sysinterval_t)-1" which is greater than - all deltas.*/ - while (vtp->delta <= chTimeDiffX(ch.vtlist.lasttime, now)) { + while (true) { vtfunc_t fn; + /* The loop is stopped by the timers header having + "ch.vtlist.vt_delta == (sysinterval_t)-1" which + is greater than all deltas.*/ + now = chVTGetSystemTimeX(); + if (vtp->delta > chTimeDiffX(ch.vtlist.lasttime, now)) { + break; + } + +#if 0 /* The "last time" becomes this timer's expiration time.*/ ch.vtlist.lasttime = chTimeAddX(ch.vtlist.lasttime, vtp->delta); +#else + /* The "last time" is set to the current time.*/ + ch.vtlist.lasttime = now; +#endif vtp->next->prev = (virtual_timer_t *)&ch.vtlist; ch.vtlist.next = vtp->next; @@ -431,10 +438,8 @@ static inline void chVTDoTickI(void) { of the list.*/ chSysLockFromISR(); - /* Next element in the list, the current time could have advanced so - recalculating the time window.*/ + /* Next element in the list.*/ vtp = ch.vtlist.next; - now = chVTGetSystemTimeX(); } /* if the list is empty, nothing else to do.*/ diff --git a/os/rt/src/chvt.c b/os/rt/src/chvt.c index 1c5b2fea2..0667bf7c3 100644 --- a/os/rt/src/chvt.c +++ b/os/rt/src/chvt.c @@ -125,6 +125,13 @@ void chVTDoSetI(virtual_timer_t *vtp, sysinterval_t delay, vtp->prev = (virtual_timer_t *)&ch.vtlist; vtp->delta = delay; +#if CH_CFG_INTERVALS_SIZE > CH_CFG_ST_RESOLUTION + /* The delta could be too large for the physical timer to handle.*/ + if (delay > (sysinterval_t)TIME_MAX_SYSTIME) { + delay = (sysinterval_t)TIME_MAX_SYSTIME; + } +#endif + /* Being the first element in the list the alarm timer is started.*/ port_timer_start_alarm(chTimeAddX(ch.vtlist.lasttime, delay)); -- cgit v1.2.3 From 882e9afb959e5ecc8800a79bb3cf3dabf1a7ccc6 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Fri, 13 Oct 2017 09:25:38 +0000 Subject: Now it is APPARENTLY working for intervals larger than system time. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10817 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h | 2 +- os/rt/include/chvt.h | 62 ++++++++++++++-------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h b/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h index 206f1d11d..bba658831 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/chconf.h @@ -42,7 +42,7 @@ * @brief System time counter resolution. * @note Allowed values are 16 or 32 bits. */ -#define CH_CFG_ST_RESOLUTION 32 +#define CH_CFG_ST_RESOLUTION 16 /** * @brief System tick frequency. diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index ea4493df3..b3a803c1a 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -398,48 +398,48 @@ static inline void chVTDoTickI(void) { /* Looping through timers.*/ vtp = ch.vtlist.next; while (true) { - vtfunc_t fn; + sysinterval_t nowdelta; - /* The loop is stopped by the timers header having - "ch.vtlist.vt_delta == (sysinterval_t)-1" which - is greater than all deltas.*/ + /* Getting the system time as reference.*/ now = chVTGetSystemTimeX(); - if (vtp->delta > chTimeDiffX(ch.vtlist.lasttime, now)) { + nowdelta = chTimeDiffX(ch.vtlist.lasttime, now); + + /* The list scan is limited by the timers header having + "ch.vtlist.vt_delta == (sysinterval_t)-1" which is + greater than all deltas.*/ + if (vtp->delta > nowdelta) { break; } -#if 0 - /* The "last time" becomes this timer's expiration time.*/ - ch.vtlist.lasttime = chTimeAddX(ch.vtlist.lasttime, vtp->delta); -#else - /* The "last time" is set to the current time.*/ - ch.vtlist.lasttime = now; -#endif + /* Consuming all timers between "vtp->lasttime" and now.*/ + do { + vtfunc_t fn; - vtp->next->prev = (virtual_timer_t *)&ch.vtlist; - ch.vtlist.next = vtp->next; - fn = vtp->func; - vtp->func = NULL; + /* Recalculated delta.*/ + nowdelta = nowdelta - vtp->delta; - /* if the list becomes empty then the timer is stopped.*/ - if (ch.vtlist.next == (virtual_timer_t *)&ch.vtlist) { - port_timer_stop_alarm(); - } + vtp->next->prev = (virtual_timer_t *)&ch.vtlist; + ch.vtlist.next = vtp->next; + fn = vtp->func; + vtp->func = NULL; - /* Leaving the system critical zone in order to execute the callback - and in order to give a preemption chance to higher priority - interrupts.*/ - chSysUnlockFromISR(); + /* if the list becomes empty then the timer is stopped.*/ + if (ch.vtlist.next == (virtual_timer_t *)&ch.vtlist) { + port_timer_stop_alarm(); + } - /* The callback is invoked outside the kernel critical zone.*/ - fn(vtp->par); + /* The callback is invoked outside the kernel critical zone.*/ + chSysUnlockFromISR(); + fn(vtp->par); + chSysLockFromISR(); - /* Re-entering the critical zone in order to continue the exploration - of the list.*/ - chSysLockFromISR(); + /* Next element in the list.*/ + vtp = ch.vtlist.next; + } + while (vtp->delta <= nowdelta); - /* Next element in the list.*/ - vtp = ch.vtlist.next; + /* The "last time" is set to the current time.*/ + ch.vtlist.lasttime = now; } /* if the list is empty, nothing else to do.*/ -- cgit v1.2.3 From cb725828056b9564ab5d723bd0738375a83c077c Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Fri, 13 Oct 2017 12:35:40 +0000 Subject: Fixed and optimizations, NOW it seems to work for intervals larger than system time. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10818 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/RT-STM32F746G-DISCOVERY/main.c | 8 ++++---- os/rt/include/chtime.h | 4 ++-- os/rt/include/chvt.h | 20 +++++++++++--------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/demos/STM32/RT-STM32F746G-DISCOVERY/main.c b/demos/STM32/RT-STM32F746G-DISCOVERY/main.c index 0e62e3604..5199ddf37 100644 --- a/demos/STM32/RT-STM32F746G-DISCOVERY/main.c +++ b/demos/STM32/RT-STM32F746G-DISCOVERY/main.c @@ -29,9 +29,9 @@ static THD_FUNCTION(Thread1, arg) { chRegSetThreadName("blinker"); while (true) { palSetLine(LINE_ARD_D13); - chThdSleepMilliseconds(500); + chThdSleepMilliseconds(1000); palClearLine(LINE_ARD_D13); - chThdSleepMilliseconds(500); + chThdSleepMilliseconds(1000); } } @@ -64,7 +64,7 @@ int main(void) { /* * Creates the example thread. */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO+1, Thread1, NULL); /* * Normal main() thread activity, in this demo it does nothing except @@ -73,6 +73,6 @@ int main(void) { while (true) { // if (palReadLine(LINE_BUTTON_USER)) // test_execute((BaseSequentialStream *)&SD1); - chThdSleepMilliseconds(500); + chThdSleepMilliseconds(2000); } } diff --git a/os/rt/include/chtime.h b/os/rt/include/chtime.h index e2e3402ef..701dfb4d5 100644 --- a/os/rt/include/chtime.h +++ b/os/rt/include/chtime.h @@ -488,7 +488,7 @@ static inline systime_t chTimeAddX(systime_t systime, */ static inline sysinterval_t chTimeDiffX(systime_t start, systime_t end) { - return (sysinterval_t)(end - start); + return (sysinterval_t)((systime_t)(end - start)); } @@ -509,7 +509,7 @@ static inline bool chTimeIsInRangeX(systime_t time, systime_t start, systime_t end) { - return (bool)((systime_t)(time - start) < (systime_t)(end - start)); + return (bool)((time - start) < (end - start)); } /** @} */ diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index b3a803c1a..e115bec63 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -393,12 +393,11 @@ static inline void chVTDoTickI(void) { #else /* CH_CFG_ST_TIMEDELTA > 0 */ virtual_timer_t *vtp; systime_t now; - sysinterval_t delta; + sysinterval_t delta, nowdelta; /* Looping through timers.*/ vtp = ch.vtlist.next; while (true) { - sysinterval_t nowdelta; /* Getting the system time as reference.*/ now = chVTGetSystemTimeX(); @@ -407,7 +406,7 @@ static inline void chVTDoTickI(void) { /* The list scan is limited by the timers header having "ch.vtlist.vt_delta == (sysinterval_t)-1" which is greater than all deltas.*/ - if (vtp->delta > nowdelta) { + if (nowdelta < vtp->delta) { break; } @@ -415,8 +414,9 @@ static inline void chVTDoTickI(void) { do { vtfunc_t fn; - /* Recalculated delta.*/ - nowdelta = nowdelta - vtp->delta; + /* The "last time" becomes this timer's expiration time.*/ + ch.vtlist.lasttime += vtp->delta; + nowdelta -= vtp->delta; vtp->next->prev = (virtual_timer_t *)&ch.vtlist; ch.vtlist.next = vtp->next; @@ -437,9 +437,6 @@ static inline void chVTDoTickI(void) { vtp = ch.vtlist.next; } while (vtp->delta <= nowdelta); - - /* The "last time" is set to the current time.*/ - ch.vtlist.lasttime = now; } /* if the list is empty, nothing else to do.*/ @@ -447,6 +444,11 @@ static inline void chVTDoTickI(void) { return; } + /* The "unprocessed nowdelta" time slice is added to "last time" + and subtracted to next timer's delta.*/ + ch.vtlist.lasttime += nowdelta; + ch.vtlist.next->delta -= nowdelta; + /* Recalculating the next alarm time.*/ delta = chTimeDiffX(now, chTimeAddX(ch.vtlist.lasttime, vtp->delta)); if (delta < (sysinterval_t)CH_CFG_ST_TIMEDELTA) { @@ -454,7 +456,7 @@ static inline void chVTDoTickI(void) { } #if CH_CFG_INTERVALS_SIZE > CH_CFG_ST_RESOLUTION /* The delta could be too large for the physical timer to handle.*/ - if (delta > (sysinterval_t)TIME_MAX_SYSTIME) { + else if (delta > (sysinterval_t)TIME_MAX_SYSTIME) { delta = (sysinterval_t)TIME_MAX_SYSTIME; } #endif -- cgit v1.2.3 From a47f5705d3f6abf4abaffa949f7bb50132507d94 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sun, 15 Oct 2017 06:51:20 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10822 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/include/hal_buffers.h | 16 ++--- os/hal/include/hal_can.h | 4 +- os/hal/include/hal_channels.h | 9 +-- os/hal/include/hal_i2c.h | 4 +- os/hal/include/hal_mac.h | 4 +- os/hal/include/hal_pal.h | 5 +- os/hal/include/hal_queues.h | 8 +-- os/hal/include/hal_uart.h | 6 +- os/hal/osal/nil/osal.h | 5 +- os/hal/osal/rt/osal.h | 138 ++++++++++++++++++++++++++++++++---------- os/hal/src/hal_buffers.c | 24 ++++---- os/hal/src/hal_can.c | 4 +- os/hal/src/hal_i2c.c | 4 +- os/hal/src/hal_mac.c | 8 +-- os/hal/src/hal_pal.c | 7 ++- os/hal/src/hal_queues.c | 12 ++-- os/hal/src/hal_serial.c | 10 +-- os/hal/src/hal_serial_usb.c | 10 +-- os/hal/src/hal_uart.c | 6 +- 19 files changed, 185 insertions(+), 99 deletions(-) diff --git a/os/hal/include/hal_buffers.h b/os/hal/include/hal_buffers.h index 7d776f4a7..ac541d286 100644 --- a/os/hal/include/hal_buffers.h +++ b/os/hal/include/hal_buffers.h @@ -284,14 +284,14 @@ extern "C" { uint8_t *ibqGetEmptyBufferI(input_buffers_queue_t *ibqp); void ibqPostFullBufferI(input_buffers_queue_t *ibqp, size_t size); msg_t ibqGetFullBufferTimeout(input_buffers_queue_t *ibqp, - systime_t timeout); + sysinterval_t timeout); msg_t ibqGetFullBufferTimeoutS(input_buffers_queue_t *ibqp, - systime_t timeout); + sysinterval_t timeout); void ibqReleaseEmptyBuffer(input_buffers_queue_t *ibqp); void ibqReleaseEmptyBufferS(input_buffers_queue_t *ibqp); - msg_t ibqGetTimeout(input_buffers_queue_t *ibqp, systime_t timeout); + msg_t ibqGetTimeout(input_buffers_queue_t *ibqp, sysinterval_t timeout); size_t ibqReadTimeout(input_buffers_queue_t *ibqp, uint8_t *bp, - size_t n, systime_t timeout); + size_t n, sysinterval_t timeout); void obqObjectInit(output_buffers_queue_t *obqp, bool suspended, uint8_t *bp, size_t size, size_t n, bqnotify_t onfy, void *link); void obqResetI(output_buffers_queue_t *obqp); @@ -299,15 +299,15 @@ extern "C" { size_t *sizep); void obqReleaseEmptyBufferI(output_buffers_queue_t *obqp); msg_t obqGetEmptyBufferTimeout(output_buffers_queue_t *obqp, - systime_t timeout); + sysinterval_t timeout); msg_t obqGetEmptyBufferTimeoutS(output_buffers_queue_t *obqp, - systime_t timeout); + sysinterval_t timeout); void obqPostFullBuffer(output_buffers_queue_t *obqp, size_t size); void obqPostFullBufferS(output_buffers_queue_t *obqp, size_t size); msg_t obqPutTimeout(output_buffers_queue_t *obqp, uint8_t b, - systime_t timeout); + sysinterval_t timeout); size_t obqWriteTimeout(output_buffers_queue_t *obqp, const uint8_t *bp, - size_t n, systime_t timeout); + size_t n, sysinterval_t timeout); bool obqTryFlushI(output_buffers_queue_t *obqp); void obqFlush(output_buffers_queue_t *obqp); #ifdef __cplusplus diff --git a/os/hal/include/hal_can.h b/os/hal/include/hal_can.h index e91d8bd8b..78bd12a20 100644 --- a/os/hal/include/hal_can.h +++ b/os/hal/include/hal_can.h @@ -152,11 +152,11 @@ extern "C" { msg_t canTransmitTimeout(CANDriver *canp, canmbx_t mailbox, const CANTxFrame *ctfp, - systime_t timeout); + sysinterval_t timeout); msg_t canReceiveTimeout(CANDriver *canp, canmbx_t mailbox, CANRxFrame *crfp, - systime_t timeout); + sysinterval_t timeout); #if CAN_USE_SLEEP_MODE void canSleep(CANDriver *canp); void canWakeup(CANDriver *canp); diff --git a/os/hal/include/hal_channels.h b/os/hal/include/hal_channels.h index 748dbe04a..f0d8f4d77 100644 --- a/os/hal/include/hal_channels.h +++ b/os/hal/include/hal_channels.h @@ -51,14 +51,15 @@ #define _base_channel_methods \ _base_sequential_stream_methods \ /* Channel put method with timeout specification.*/ \ - msg_t (*putt)(void *instance, uint8_t b, systime_t time); \ + msg_t (*putt)(void *instance, uint8_t b, sysinterval_t time); \ /* Channel get method with timeout specification.*/ \ - msg_t (*gett)(void *instance, systime_t time); \ + msg_t (*gett)(void *instance, sysinterval_t time); \ /* Channel write method with timeout specification.*/ \ size_t (*writet)(void *instance, const uint8_t *bp, \ - size_t n, systime_t time); \ + size_t n, sysinterval_t time); \ /* Channel read method with timeout specification.*/ \ - size_t (*readt)(void *instance, uint8_t *bp, size_t n, systime_t time); \ + size_t (*readt)(void *instance, uint8_t *bp, size_t n, \ + sysinterval_t time); \ /* Channel put method with timeout specification.*/ \ msg_t (*ctl)(void *instance, unsigned int operation, void *arg); diff --git a/os/hal/include/hal_i2c.h b/os/hal/include/hal_i2c.h index c9c8409cb..379c56308 100644 --- a/os/hal/include/hal_i2c.h +++ b/os/hal/include/hal_i2c.h @@ -145,11 +145,11 @@ extern "C" { i2caddr_t addr, const uint8_t *txbuf, size_t txbytes, uint8_t *rxbuf, size_t rxbytes, - systime_t timeout); + sysinterval_t timeout); msg_t i2cMasterReceiveTimeout(I2CDriver *i2cp, i2caddr_t addr, uint8_t *rxbuf, size_t rxbytes, - systime_t timeout); + sysinterval_t timeout); #if I2C_USE_MUTUAL_EXCLUSION == TRUE void i2cAcquireBus(I2CDriver *i2cp); void i2cReleaseBus(I2CDriver *i2cp); diff --git a/os/hal/include/hal_mac.h b/os/hal/include/hal_mac.h index 5c7bc82de..0ca5e5fcd 100644 --- a/os/hal/include/hal_mac.h +++ b/os/hal/include/hal_mac.h @@ -184,11 +184,11 @@ extern "C" { void macSetAddress(MACDriver *macp, const uint8_t *p); msg_t macWaitTransmitDescriptor(MACDriver *macp, MACTransmitDescriptor *tdp, - systime_t timeout); + sysinterval_t timeout); void macReleaseTransmitDescriptor(MACTransmitDescriptor *tdp); msg_t macWaitReceiveDescriptor(MACDriver *macp, MACReceiveDescriptor *rdp, - systime_t timeout); + sysinterval_t timeout); void macReleaseReceiveDescriptor(MACReceiveDescriptor *rdp); bool macPollLinkStatus(MACDriver *macp); #ifdef __cplusplus diff --git a/os/hal/include/hal_pal.h b/os/hal/include/hal_pal.h index e2d85f0fe..fdf4e2586 100644 --- a/os/hal/include/hal_pal.h +++ b/os/hal/include/hal_pal.h @@ -1006,8 +1006,9 @@ extern "C" { void palSetLineCallbackI(ioline_t line, palcallback_t cb, void *arg); #endif /* PAL_USE_CALLBACKS */ #if PAL_USE_WAIT || defined(__DOXYGEN__) - msg_t palWaitPadTimeoutS(ioportid_t port, iopadid_t pad, systime_t timeout); - msg_t palWaitLineTimeoutS(ioline_t line, systime_t timeout); + msg_t palWaitPadTimeoutS(ioportid_t port, iopadid_t pad, + sysinterval_t timeout); + msg_t palWaitLineTimeoutS(ioline_t line, sysinterval_t timeout); #endif /* PAL_USE_WAIT */ #ifdef __cplusplus } diff --git a/os/hal/include/hal_queues.h b/os/hal/include/hal_queues.h index 1f2777e76..ffafc8805 100644 --- a/os/hal/include/hal_queues.h +++ b/os/hal/include/hal_queues.h @@ -278,17 +278,17 @@ extern "C" { qnotify_t infy, void *link); void iqResetI(input_queue_t *iqp); msg_t iqPutI(input_queue_t *iqp, uint8_t b); - msg_t iqGetTimeout(input_queue_t *iqp, systime_t timeout); + msg_t iqGetTimeout(input_queue_t *iqp, sysinterval_t timeout); size_t iqReadTimeout(input_queue_t *iqp, uint8_t *bp, - size_t n, systime_t timeout); + size_t n, sysinterval_t timeout); void oqObjectInit(output_queue_t *oqp, uint8_t *bp, size_t size, qnotify_t onfy, void *link); void oqResetI(output_queue_t *oqp); - msg_t oqPutTimeout(output_queue_t *oqp, uint8_t b, systime_t timeout); + msg_t oqPutTimeout(output_queue_t *oqp, uint8_t b, sysinterval_t timeout); msg_t oqGetI(output_queue_t *oqp); size_t oqWriteTimeout(output_queue_t *oqp, const uint8_t *bp, - size_t n, systime_t timeout); + size_t n, sysinterval_t timeout); #ifdef __cplusplus } #endif diff --git a/os/hal/include/hal_uart.h b/os/hal/include/hal_uart.h index 5523b82f1..01d61df7a 100644 --- a/os/hal/include/hal_uart.h +++ b/os/hal/include/hal_uart.h @@ -359,11 +359,11 @@ extern "C" { size_t uartStopReceiveI(UARTDriver *uartp); #if UART_USE_WAIT == TRUE msg_t uartSendTimeout(UARTDriver *uartp, size_t *np, - const void *txbuf, systime_t timeout); + const void *txbuf, sysinterval_t timeout); msg_t uartSendFullTimeout(UARTDriver *uartp, size_t *np, - const void *txbuf, systime_t timeout); + const void *txbuf, sysinterval_t timeout); msg_t uartReceiveTimeout(UARTDriver *uartp, size_t *np, - void *rxbuf, systime_t timeout); + void *rxbuf, sysinterval_t timeout); #endif #if UART_USE_MUTUAL_EXCLUSION == TRUE void uartAcquireBus(UARTDriver *uartp); diff --git a/os/hal/osal/nil/osal.h b/os/hal/osal/nil/osal.h index 5f3ff1bc5..9a8d16d12 100644 --- a/os/hal/osal/nil/osal.h +++ b/os/hal/osal/nil/osal.h @@ -875,8 +875,9 @@ static inline void osalEventBroadcastFlags(event_source_t *esp, osalDbgCheck(esp != NULL); chSysLock(); - osalEventBroadcastFlagsI(esp, flags); - chSchRescheduleS(); + esp->flags |= flags; + if (esp->cb != NULL) { + esp->cb(esp); chSysUnlock(); } diff --git a/os/hal/osal/rt/osal.h b/os/hal/osal/rt/osal.h index 07072e88f..c81edef4f 100644 --- a/os/hal/osal/rt/osal.h +++ b/os/hal/osal/rt/osal.h @@ -67,8 +67,8 @@ * @name Special time constants * @{ */ -#define TIME_IMMEDIATE ((systime_t)0) -#define TIME_INFINITE ((systime_t)-1) +#define TIME_IMMEDIATE ((sysinterval_t)0) +#define TIME_INFINITE ((sysinterval_t)-1) /** @} */ #endif @@ -148,6 +148,13 @@ typedef int32_t msg_t; typedef uint32_t systime_t; #endif +#if 0 +/** + * @brief Type of system time counter. + */ +typedef uint32_t sysinterval_t; +#endif + #if 0 /** * @brief Type of realtime counter. @@ -179,14 +186,15 @@ typedef uint32_t eventflags_t; * API and are implementation-dependent. */ typedef struct { - volatile eventflags_t flags; /**< @brief Flags stored into the - object. */ + volatile eventflags_t flags; /**< @brief Stored event flags. */ + eventcallback_t cb; /**< @brief Event source callback. */ + void *param; /**< @brief User defined field. */ } event_source_t; #endif /** * @brief Type of a mutex. - * @note If the OS does not support mutexes or there is no OS then them + * @note If the OS does not support mutexes or there is no OS then the * mechanism can be simulated. */ #if CH_CFG_USE_MUTEXES || defined(__DOXYGEN__) @@ -304,36 +312,36 @@ typedef struct { * @details Converts from seconds to system ticks number. * @note The result is rounded upward to the next tick boundary. * - * @param[in] sec number of seconds + * @param[in] secs number of seconds * @return The number of ticks. * * @api */ -#define OSAL_S2ST(sec) S2ST(sec) +#define OSAL_S2I(secs) TIME_S2I(secs) /** * @brief Milliseconds to system ticks. * @details Converts from milliseconds to system ticks number. * @note The result is rounded upward to the next tick boundary. * - * @param[in] msec number of milliseconds + * @param[in] msecs number of milliseconds * @return The number of ticks. * * @api */ -#define OSAL_MS2ST(msec) TIME_MS2I(msec) +#define OSAL_MS2I(msecs) TIME_MS2I(msecs) /** * @brief Microseconds to system ticks. * @details Converts from microseconds to system ticks number. * @note The result is rounded upward to the next tick boundary. * - * @param[in] usec number of microseconds + * @param[in] usecs number of microseconds * @return The number of ticks. * * @api */ -#define OSAL_US2ST(usec) TIME_US2I(usec) +#define OSAL_US2I(usecs) TIME_US2I(usecs) /** @} */ /** @@ -392,11 +400,11 @@ typedef struct { * system tick clock. * @note The maximum specifiable value is implementation dependent. * - * @param[in] sec time in seconds, must be different from zero + * @param[in] secs time in seconds, must be different from zero * * @api */ -#define osalThreadSleepSeconds(sec) osalThreadSleep(OSAL_S2ST(sec)) +#define osalThreadSleepSeconds(secs) osalThreadSleep(OSAL_S2I(secs)) /** * @brief Delays the invoking thread for the specified number of @@ -405,11 +413,11 @@ typedef struct { * system tick clock. * @note The maximum specifiable value is implementation dependent. * - * @param[in] msec time in milliseconds, must be different from zero + * @param[in] msecs time in milliseconds, must be different from zero * * @api */ -#define osalThreadSleepMilliseconds(msec) osalThreadSleep(OSAL_MS2ST(msec)) +#define osalThreadSleepMilliseconds(msecs) osalThreadSleep(OSAL_MS2I(msecs)) /** * @brief Delays the invoking thread for the specified number of @@ -418,11 +426,11 @@ typedef struct { * system tick clock. * @note The maximum specifiable value is implementation dependent. * - * @param[in] usec time in microseconds, must be different from zero + * @param[in] usecs time in microseconds, must be different from zero * * @api */ -#define osalThreadSleepMicroseconds(usec) osalThreadSleep(OSAL_US2ST(usec)) +#define osalThreadSleepMicroseconds(usecs) osalThreadSleep(OSAL_US2I(usecs)) /** @} */ /*===========================================================================*/ @@ -618,6 +626,35 @@ static inline systime_t osalOsGetSystemTimeX(void) { return chVTGetSystemTimeX(); } +/** + * @brief Adds an interval to a system time returning a system time. + * + * @param[in] systime base system time + * @param[in] interval interval to be added + * @return The new system time. + * + * @xclass + */ +static inline systime_t osalTimeAddX(systime_t systime, + sysinterval_t interval) { + + return chTimeAddX(systime, interval); +} + +/** + * @brief Subtracts two system times returning an interval. + * + * @param[in] start first system time + * @param[in] end second system time + * @return The interval representing the time difference. + * + * @xclass + */ +static inline sysinterval_t osalTimeDiffX(systime_t start, systime_t end) { + + return chTimeDiffX(start, end); +} + /** * @brief Checks if the specified time is within the specified time window. * @note When start==end then the function returns always true because the @@ -632,9 +669,9 @@ static inline systime_t osalOsGetSystemTimeX(void) { * * @xclass */ -static inline bool osalOsIsTimeWithinX(systime_t time, - systime_t start, - systime_t end) { +static inline bool osalTimeIsInRangeX(systime_t time, + systime_t start, + systime_t end) { return chTimeIsInRangeX(time, start, end); } @@ -642,7 +679,7 @@ static inline bool osalOsIsTimeWithinX(systime_t time, /** * @brief Suspends the invoking thread for the specified time. * - * @param[in] time the delay in system ticks, the special values are + * @param[in] delay the delay in system ticks, the special values are * handled as follow: * - @a TIME_INFINITE is allowed but interpreted as a * normal time specification. @@ -651,15 +688,15 @@ static inline bool osalOsIsTimeWithinX(systime_t time, * * @sclass */ -static inline void osalThreadSleepS(systime_t time) { +static inline void osalThreadSleepS(sysinterval_t delay) { - chThdSleepS(time); + chThdSleepS(delay); } /** * @brief Suspends the invoking thread for the specified time. * - * @param[in] time the delay in system ticks, the special values are + * @param[in] delay the delay in system ticks, the special values are * handled as follow: * - @a TIME_INFINITE is allowed but interpreted as a * normal time specification. @@ -668,9 +705,9 @@ static inline void osalThreadSleepS(systime_t time) { * * @api */ -static inline void osalThreadSleep(systime_t time) { +static inline void osalThreadSleep(sysinterval_t delay) { - chThdSleep(time); + chThdSleep(delay); } /** @@ -708,7 +745,7 @@ static inline msg_t osalThreadSuspendS(thread_reference_t *trp) { * @sclass */ static inline msg_t osalThreadSuspendTimeoutS(thread_reference_t *trp, - systime_t timeout) { + sysinterval_t timeout) { return chThdSuspendTimeoutS(trp, timeout); } @@ -761,7 +798,7 @@ static inline void osalThreadQueueObjectInit(threads_queue_t *tqp) { * dequeued or the specified timeouts expires. * * @param[in] tqp pointer to the threads queue object - * @param[in] time the timeout in system ticks, the special values are + * @param[in] timeout the timeout in system ticks, the special values are * handled as follow: * - @a TIME_INFINITE the thread enters an infinite sleep * state. @@ -779,9 +816,9 @@ static inline void osalThreadQueueObjectInit(threads_queue_t *tqp) { * @sclass */ static inline msg_t osalThreadEnqueueTimeoutS(threads_queue_t *tqp, - systime_t time) { + sysinterval_t timeout) { - return chThdEnqueueTimeoutS(tqp, time); + return chThdEnqueueTimeoutS(tqp, timeout); } /** @@ -823,9 +860,13 @@ static inline void osalEventObjectInit(event_source_t *esp) { chEvtObjectInit(esp); } #else -static inline void osalEventObjectInit(event_source_t *esp) { +static inline void osalEventObjectInit(osal_event_source_t *esp) { + + osalDbgCheck(esp != NULL); esp->flags = 0; + esp->cb = NULL; + esp->param = NULL; } #endif @@ -847,7 +888,12 @@ static inline void osalEventBroadcastFlagsI(event_source_t *esp, static inline void osalEventBroadcastFlagsI(event_source_t *esp, eventflags_t flags) { + osalDbgCheck(esp != NULL); + esp->flags |= flags; + if (esp->cb != NULL) { + esp->cb(esp); + } } #endif @@ -868,12 +914,42 @@ static inline void osalEventBroadcastFlags(event_source_t *esp, #else static inline void osalEventBroadcastFlags(event_source_t *esp, eventflags_t flags) { + + osalDbgCheck(esp != NULL); + osalSysLock(); esp->flags |= flags; + if (esp->cb != NULL) { + esp->cb(esp); osalSysUnlock(); } #endif +#if !CH_CFG_USE_EVENTS || defined(__DOXYGEN__) +/** + * @brief Event callback setup. + * @note The callback is invoked from ISR context and can + * only invoke I-Class functions. The callback is meant + * to wakeup the task that will handle the event by + * calling @p osalEventGetAndClearFlagsI(). + * + * @param[in] esp pointer to the event flags object + * @param[in] cb pointer to the callback function + * @param[in] param parameter to be passed to the callback function + * + * @api + */ +static inline void osalEventSetCallback(event_source_t *esp, + eventcallback_t cb, + void *param) { + + osalDbgCheck(esp != NULL); + + esp->cb = cb; + esp->param = param; +} +#endif + /** * @brief Initializes s @p mutex_t object. * diff --git a/os/hal/src/hal_buffers.c b/os/hal/src/hal_buffers.c index 871fd0a42..0f1e35440 100644 --- a/os/hal/src/hal_buffers.c +++ b/os/hal/src/hal_buffers.c @@ -188,7 +188,7 @@ void ibqPostFullBufferI(input_buffers_queue_t *ibqp, size_t size) { * @api */ msg_t ibqGetFullBufferTimeout(input_buffers_queue_t *ibqp, - systime_t timeout) { + sysinterval_t timeout) { msg_t msg; osalSysLock(); @@ -220,7 +220,7 @@ msg_t ibqGetFullBufferTimeout(input_buffers_queue_t *ibqp, * @sclass */ msg_t ibqGetFullBufferTimeoutS(input_buffers_queue_t *ibqp, - systime_t timeout) { + sysinterval_t timeout) { osalDbgCheckClassS(); @@ -306,7 +306,7 @@ void ibqReleaseEmptyBuffer(input_buffers_queue_t *ibqp) { * * @api */ -msg_t ibqGetTimeout(input_buffers_queue_t *ibqp, systime_t timeout) { +msg_t ibqGetTimeout(input_buffers_queue_t *ibqp, sysinterval_t timeout) { msg_t msg; osalSysLock(); @@ -356,9 +356,9 @@ msg_t ibqGetTimeout(input_buffers_queue_t *ibqp, systime_t timeout) { * @api */ size_t ibqReadTimeout(input_buffers_queue_t *ibqp, uint8_t *bp, - size_t n, systime_t timeout) { + size_t n, sysinterval_t timeout) { size_t r = 0; - systime_t deadline; + sysinterval_t deadline; osalDbgCheck(n > 0U); @@ -380,7 +380,7 @@ size_t ibqReadTimeout(input_buffers_queue_t *ibqp, uint8_t *bp, msg = ibqGetFullBufferTimeoutS(ibqp, timeout); } else { - systime_t next_timeout = deadline - osalOsGetSystemTimeX(); + sysinterval_t next_timeout = deadline - osalOsGetSystemTimeX(); /* Handling the case where the system time went past the deadline, in this case next becomes a very high number because the system @@ -562,7 +562,7 @@ void obqReleaseEmptyBufferI(output_buffers_queue_t *obqp) { * @api */ msg_t obqGetEmptyBufferTimeout(output_buffers_queue_t *obqp, - systime_t timeout) { + sysinterval_t timeout) { msg_t msg; osalSysLock(); @@ -594,7 +594,7 @@ msg_t obqGetEmptyBufferTimeout(output_buffers_queue_t *obqp, * @sclass */ msg_t obqGetEmptyBufferTimeoutS(output_buffers_queue_t *obqp, - systime_t timeout) { + sysinterval_t timeout) { osalDbgCheckClassS(); @@ -688,7 +688,7 @@ void obqPostFullBufferS(output_buffers_queue_t *obqp, size_t size) { * @api */ msg_t obqPutTimeout(output_buffers_queue_t *obqp, uint8_t b, - systime_t timeout) { + sysinterval_t timeout) { msg_t msg; osalSysLock(); @@ -738,9 +738,9 @@ msg_t obqPutTimeout(output_buffers_queue_t *obqp, uint8_t b, * @api */ size_t obqWriteTimeout(output_buffers_queue_t *obqp, const uint8_t *bp, - size_t n, systime_t timeout) { + size_t n, sysinterval_t timeout) { size_t w = 0; - systime_t deadline; + sysinterval_t deadline; osalDbgCheck(n > 0U); @@ -762,7 +762,7 @@ size_t obqWriteTimeout(output_buffers_queue_t *obqp, const uint8_t *bp, msg = obqGetEmptyBufferTimeoutS(obqp, timeout); } else { - systime_t next_timeout = deadline - osalOsGetSystemTimeX(); + sysinterval_t next_timeout = deadline - osalOsGetSystemTimeX(); /* Handling the case where the system time went past the deadline, in this case next becomes a very high number because the system diff --git a/os/hal/src/hal_can.c b/os/hal/src/hal_can.c index 014d59c70..122e5eb76 100644 --- a/os/hal/src/hal_can.c +++ b/os/hal/src/hal_can.c @@ -233,7 +233,7 @@ bool canTryReceiveI(CANDriver *canp, msg_t canTransmitTimeout(CANDriver *canp, canmbx_t mailbox, const CANTxFrame *ctfp, - systime_t timeout) { + sysinterval_t timeout) { osalDbgCheck((canp != NULL) && (ctfp != NULL) && (mailbox <= (canmbx_t)CAN_TX_MAILBOXES)); @@ -281,7 +281,7 @@ msg_t canTransmitTimeout(CANDriver *canp, msg_t canReceiveTimeout(CANDriver *canp, canmbx_t mailbox, CANRxFrame *crfp, - systime_t timeout) { + sysinterval_t timeout) { osalDbgCheck((canp != NULL) && (crfp != NULL) && (mailbox <= (canmbx_t)CAN_RX_MAILBOXES)); diff --git a/os/hal/src/hal_i2c.c b/os/hal/src/hal_i2c.c index 54a362f0c..02d405daa 100644 --- a/os/hal/src/hal_i2c.c +++ b/os/hal/src/hal_i2c.c @@ -173,7 +173,7 @@ msg_t i2cMasterTransmitTimeout(I2CDriver *i2cp, size_t txbytes, uint8_t *rxbuf, size_t rxbytes, - systime_t timeout) { + sysinterval_t timeout) { msg_t rdymsg; osalDbgCheck((i2cp != NULL) && (addr != 0U) && @@ -222,7 +222,7 @@ msg_t i2cMasterReceiveTimeout(I2CDriver *i2cp, i2caddr_t addr, uint8_t *rxbuf, size_t rxbytes, - systime_t timeout){ + sysinterval_t timeout) { msg_t rdymsg; diff --git a/os/hal/src/hal_mac.c b/os/hal/src/hal_mac.c index 7d0f4cf43..2ae0b677d 100644 --- a/os/hal/src/hal_mac.c +++ b/os/hal/src/hal_mac.c @@ -149,7 +149,7 @@ void macStop(MACDriver *macp) { */ msg_t macWaitTransmitDescriptor(MACDriver *macp, MACTransmitDescriptor *tdp, - systime_t timeout) { + sysinterval_t timeout) { msg_t msg; systime_t now; @@ -157,7 +157,7 @@ msg_t macWaitTransmitDescriptor(MACDriver *macp, osalDbgAssert(macp->state == MAC_ACTIVE, "not active"); while (((msg = mac_lld_get_transmit_descriptor(macp, tdp)) != MSG_OK) && - (timeout > (systime_t)0)) { + (timeout > (sysinterval_t)0)) { osalSysLock(); now = osalOsGetSystemTimeX(); msg = osalThreadEnqueueTimeoutS(&macp->tdqueue, timeout); @@ -209,7 +209,7 @@ void macReleaseTransmitDescriptor(MACTransmitDescriptor *tdp) { */ msg_t macWaitReceiveDescriptor(MACDriver *macp, MACReceiveDescriptor *rdp, - systime_t timeout) { + sysinterval_t timeout) { msg_t msg; systime_t now; @@ -217,7 +217,7 @@ msg_t macWaitReceiveDescriptor(MACDriver *macp, osalDbgAssert(macp->state == MAC_ACTIVE, "not active"); while (((msg = mac_lld_get_receive_descriptor(macp, rdp)) != MSG_OK) && - (timeout > (systime_t)0)) { + (timeout > (sysinterval_t)0)) { osalSysLock(); now = osalOsGetSystemTimeX(); msg = osalThreadEnqueueTimeoutS(&macp->rdqueue, timeout); diff --git a/os/hal/src/hal_pal.c b/os/hal/src/hal_pal.c index b46c9e7ea..3a83005ec 100644 --- a/os/hal/src/hal_pal.c +++ b/os/hal/src/hal_pal.c @@ -167,7 +167,9 @@ void palSetLineCallbackI(ioline_t line, palcallback_t cb, void *arg) { * * @sclass */ -msg_t palWaitPadTimeoutS(ioportid_t port, iopadid_t pad, systime_t timeout) { +msg_t palWaitPadTimeoutS(ioportid_t port, + iopadid_t pad, + sysinterval_t timeout) { palevent_t *pep = pal_lld_get_pad_event(port, pad); return osalThreadEnqueueTimeoutS(&pep->threads, timeout); @@ -186,7 +188,8 @@ msg_t palWaitPadTimeoutS(ioportid_t port, iopadid_t pad, systime_t timeout) { * * @sclass */ -msg_t palWaitLineTimeoutS(ioline_t line, systime_t timeout) { +msg_t palWaitLineTimeoutS(ioline_t line, + sysinterval_t timeout) { palevent_t *pep = pal_lld_get_line_event(line); return osalThreadEnqueueTimeoutS(&pep->threads, timeout); diff --git a/os/hal/src/hal_queues.c b/os/hal/src/hal_queues.c index d0ef6f489..d3ead6998 100644 --- a/os/hal/src/hal_queues.c +++ b/os/hal/src/hal_queues.c @@ -138,7 +138,7 @@ msg_t iqPutI(input_queue_t *iqp, uint8_t b) { * * @api */ -msg_t iqGetTimeout(input_queue_t *iqp, systime_t timeout) { +msg_t iqGetTimeout(input_queue_t *iqp, sysinterval_t timeout) { uint8_t b; osalSysLock(); @@ -194,7 +194,7 @@ msg_t iqGetTimeout(input_queue_t *iqp, systime_t timeout) { * @api */ size_t iqReadTimeout(input_queue_t *iqp, uint8_t *bp, - size_t n, systime_t timeout) { + size_t n, sysinterval_t timeout) { systime_t deadline; qnotify_t nfy = iqp->q_notify; size_t r = 0; @@ -219,7 +219,7 @@ size_t iqReadTimeout(input_queue_t *iqp, uint8_t *bp, msg = osalThreadEnqueueTimeoutS(&iqp->q_waiting, timeout); } else { - systime_t next_timeout = deadline - osalOsGetSystemTimeX(); + sysinterval_t next_timeout = deadline - osalOsGetSystemTimeX(); /* Handling the case where the system time went past the deadline, in this case next becomes a very high number because the system @@ -334,7 +334,7 @@ void oqResetI(output_queue_t *oqp) { * * @api */ -msg_t oqPutTimeout(output_queue_t *oqp, uint8_t b, systime_t timeout) { +msg_t oqPutTimeout(output_queue_t *oqp, uint8_t b, sysinterval_t timeout) { osalSysLock(); @@ -419,7 +419,7 @@ msg_t oqGetI(output_queue_t *oqp) { * @api */ size_t oqWriteTimeout(output_queue_t *oqp, const uint8_t *bp, - size_t n, systime_t timeout) { + size_t n, sysinterval_t timeout) { systime_t deadline; qnotify_t nfy = oqp->q_notify; size_t w = 0; @@ -443,7 +443,7 @@ size_t oqWriteTimeout(output_queue_t *oqp, const uint8_t *bp, msg = osalThreadEnqueueTimeoutS(&oqp->q_waiting, timeout); } else { - systime_t next_timeout = deadline - osalOsGetSystemTimeX(); + sysinterval_t next_timeout = deadline - osalOsGetSystemTimeX(); /* Handling the case where the system time went past the deadline, in this case next becomes a very high number because the system diff --git a/os/hal/src/hal_serial.c b/os/hal/src/hal_serial.c index 5c24c8216..6658a44e0 100644 --- a/os/hal/src/hal_serial.c +++ b/os/hal/src/hal_serial.c @@ -69,22 +69,24 @@ static msg_t _get(void *ip) { return iqGetTimeout(&((SerialDriver *)ip)->iqueue, TIME_INFINITE); } -static msg_t _putt(void *ip, uint8_t b, systime_t timeout) { +static msg_t _putt(void *ip, uint8_t b, sysinterval_t timeout) { return oqPutTimeout(&((SerialDriver *)ip)->oqueue, b, timeout); } -static msg_t _gett(void *ip, systime_t timeout) { +static msg_t _gett(void *ip, sysinterval_t timeout) { return iqGetTimeout(&((SerialDriver *)ip)->iqueue, timeout); } -static size_t _writet(void *ip, const uint8_t *bp, size_t n, systime_t timeout) { +static size_t _writet(void *ip, const uint8_t *bp, size_t n, + sysinterval_t timeout) { return oqWriteTimeout(&((SerialDriver *)ip)->oqueue, bp, n, timeout); } -static size_t _readt(void *ip, uint8_t *bp, size_t n, systime_t timeout) { +static size_t _readt(void *ip, uint8_t *bp, size_t n, + sysinterval_t timeout) { return iqReadTimeout(&((SerialDriver *)ip)->iqueue, bp, n, timeout); } diff --git a/os/hal/src/hal_serial_usb.c b/os/hal/src/hal_serial_usb.c index 1af9b50a3..f2dcd6c32 100644 --- a/os/hal/src/hal_serial_usb.c +++ b/os/hal/src/hal_serial_usb.c @@ -104,22 +104,24 @@ static msg_t _get(void *ip) { return ibqGetTimeout(&((SerialUSBDriver *)ip)->ibqueue, TIME_INFINITE); } -static msg_t _putt(void *ip, uint8_t b, systime_t timeout) { +static msg_t _putt(void *ip, uint8_t b, sysinterval_t timeout) { return obqPutTimeout(&((SerialUSBDriver *)ip)->obqueue, b, timeout); } -static msg_t _gett(void *ip, systime_t timeout) { +static msg_t _gett(void *ip, sysinterval_t timeout) { return ibqGetTimeout(&((SerialUSBDriver *)ip)->ibqueue, timeout); } -static size_t _writet(void *ip, const uint8_t *bp, size_t n, systime_t timeout) { +static size_t _writet(void *ip, const uint8_t *bp, size_t n, + sysinterval_t timeout) { return obqWriteTimeout(&((SerialUSBDriver *)ip)->obqueue, bp, n, timeout); } -static size_t _readt(void *ip, uint8_t *bp, size_t n, systime_t timeout) { +static size_t _readt(void *ip, uint8_t *bp, size_t n, + sysinterval_t timeout) { return ibqReadTimeout(&((SerialUSBDriver *)ip)->ibqueue, bp, n, timeout); } diff --git a/os/hal/src/hal_uart.c b/os/hal/src/hal_uart.c index 89276f28f..ac3e4df3e 100644 --- a/os/hal/src/hal_uart.c +++ b/os/hal/src/hal_uart.c @@ -367,7 +367,7 @@ size_t uartStopReceiveI(UARTDriver *uartp) { * @api */ msg_t uartSendTimeout(UARTDriver *uartp, size_t *np, - const void *txbuf, systime_t timeout) { + const void *txbuf, sysinterval_t timeout) { msg_t msg; osalDbgCheck((uartp != NULL) && (*np > 0U) && (txbuf != NULL)); @@ -412,7 +412,7 @@ msg_t uartSendTimeout(UARTDriver *uartp, size_t *np, * @api */ msg_t uartSendFullTimeout(UARTDriver *uartp, size_t *np, - const void *txbuf, systime_t timeout) { + const void *txbuf, sysinterval_t timeout) { msg_t msg; osalDbgCheck((uartp != NULL) && (*np > 0U) && (txbuf != NULL)); @@ -459,7 +459,7 @@ msg_t uartSendFullTimeout(UARTDriver *uartp, size_t *np, * @api */ msg_t uartReceiveTimeout(UARTDriver *uartp, size_t *np, - void *rxbuf, systime_t timeout) { + void *rxbuf, sysinterval_t timeout) { msg_t msg; osalDbgCheck((uartp != NULL) && (*np > 0U) && (rxbuf != NULL)); -- cgit v1.2.3 From 5596d3e69e0d1c7c9a7b07f9bf83416d2c25cd8b Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Mon, 16 Oct 2017 09:14:15 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/rt5_dev_point1@10832 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/src/hal_queues.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/os/hal/src/hal_queues.c b/os/hal/src/hal_queues.c index d3ead6998..66e8a89cd 100644 --- a/os/hal/src/hal_queues.c +++ b/os/hal/src/hal_queues.c @@ -206,7 +206,7 @@ size_t iqReadTimeout(input_queue_t *iqp, uint8_t *bp, /* Time deadline for the whole operation, note the result is invalid when timeout is TIME_INFINITE or TIME_IMMEDIATE but in that case the deadline is not used.*/ - deadline = osalOsGetSystemTimeX() + timeout; + deadline = osalTimeAddX(osalOsGetSystemTimeX(), timeout); while (true) { /* Waiting until there is a character available or a timeout occurs.*/ @@ -219,7 +219,8 @@ size_t iqReadTimeout(input_queue_t *iqp, uint8_t *bp, msg = osalThreadEnqueueTimeoutS(&iqp->q_waiting, timeout); } else { - sysinterval_t next_timeout = deadline - osalOsGetSystemTimeX(); + sysinterval_t next_timeout = osalTimeDiffX(osalOsGetSystemTimeX(), + deadline); /* Handling the case where the system time went past the deadline, in this case next becomes a very high number because the system @@ -431,7 +432,7 @@ size_t oqWriteTimeout(output_queue_t *oqp, const uint8_t *bp, /* Time deadline for the whole operation, note the result is invalid when timeout is TIME_INFINITE or TIME_IMMEDIATE but in that case the deadline is not used.*/ - deadline = osalOsGetSystemTimeX() + timeout; + deadline = osalTimeAddX(osalOsGetSystemTimeX(), timeout); while (true) { msg_t msg; @@ -443,7 +444,8 @@ size_t oqWriteTimeout(output_queue_t *oqp, const uint8_t *bp, msg = osalThreadEnqueueTimeoutS(&oqp->q_waiting, timeout); } else { - sysinterval_t next_timeout = deadline - osalOsGetSystemTimeX(); + sysinterval_t next_timeout = osalTimeDiffX(osalOsGetSystemTimeX(), + deadline); /* Handling the case where the system time went past the deadline, in this case next becomes a very high number because the system -- cgit v1.2.3