diff --git a/demos/ARM7-AT91SAM7X-GCC/chconf.h b/demos/ARM7-AT91SAM7X-GCC/chconf.h index 45c63947b..122d34c97 100644 --- a/demos/ARM7-AT91SAM7X-GCC/chconf.h +++ b/demos/ARM7-AT91SAM7X-GCC/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES @@ -75,6 +81,7 @@ /** Configuration option: if specified then the * \p chThdGetExitEventSource() function is included in the kernel. + * @note requires \p CH_USE_MESSAGES. * @note requires \p CH_USE_EVENTS. * @deprecated \p THREAD_EXT_EXIT should be used, this functionality will be * removed in version 1.0.0.*/ @@ -150,8 +157,8 @@ //#define CH_CURRP_REGISTER_CACHE "r7" /** Configuration option: Includes basic debug support to the kernel. - * @note the debug support is port-dependent, it may be not present on some - * targets. In that case stub functions will be included. + * @note The debug support is port-dependent, it may be not present on some + * targets. In that case stub functions will be included. */ //#define CH_USE_DEBUG diff --git a/demos/ARM7-AT91SAM7X-WEB-GCC/chconf.h b/demos/ARM7-AT91SAM7X-WEB-GCC/chconf.h index 493c66fb0..513c352a6 100644 --- a/demos/ARM7-AT91SAM7X-WEB-GCC/chconf.h +++ b/demos/ARM7-AT91SAM7X-WEB-GCC/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/demos/ARM7-LPC214x-G++/chconf.h b/demos/ARM7-LPC214x-G++/chconf.h index 77b8b109d..e4595ba4a 100644 --- a/demos/ARM7-LPC214x-G++/chconf.h +++ b/demos/ARM7-LPC214x-G++/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/demos/ARM7-LPC214x-GCC-minimal/chconf.h b/demos/ARM7-LPC214x-GCC-minimal/chconf.h index fbc6d496e..df9f1fa97 100644 --- a/demos/ARM7-LPC214x-GCC-minimal/chconf.h +++ b/demos/ARM7-LPC214x-GCC-minimal/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ //#define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +//#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ //#define CH_USE_MESSAGES diff --git a/demos/ARM7-LPC214x-GCC/chconf.h b/demos/ARM7-LPC214x-GCC/chconf.h index 493c66fb0..513c352a6 100644 --- a/demos/ARM7-LPC214x-GCC/chconf.h +++ b/demos/ARM7-LPC214x-GCC/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/demos/ARMCM3-STM32F103-GCC/chconf.h b/demos/ARMCM3-STM32F103-GCC/chconf.h index 493c66fb0..513c352a6 100644 --- a/demos/ARMCM3-STM32F103-GCC/chconf.h +++ b/demos/ARMCM3-STM32F103-GCC/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/demos/AVR-AT90CANx-GCC/chconf.h b/demos/AVR-AT90CANx-GCC/chconf.h index 383f714f3..7e972155f 100644 --- a/demos/AVR-AT90CANx-GCC/chconf.h +++ b/demos/AVR-AT90CANx-GCC/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/demos/AVR-ATmega128-GCC/chconf.h b/demos/AVR-ATmega128-GCC/chconf.h index 87b92479e..bda3d497b 100644 --- a/demos/AVR-ATmega128-GCC/chconf.h +++ b/demos/AVR-ATmega128-GCC/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/demos/MSP430-MSP430x1611-GCC/chconf.h b/demos/MSP430-MSP430x1611-GCC/chconf.h index c2204e3da..dc9574ef7 100644 --- a/demos/MSP430-MSP430x1611-GCC/chconf.h +++ b/demos/MSP430-MSP430x1611-GCC/chconf.h @@ -64,6 +64,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/demos/Win32-MinGW/chconf.h b/demos/Win32-MinGW/chconf.h index 7c0420af6..7a444aa2d 100644 --- a/demos/Win32-MinGW/chconf.h +++ b/demos/Win32-MinGW/chconf.h @@ -59,6 +59,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES diff --git a/readme.txt b/readme.txt index 24e874ed7..36ec1d975 100644 --- a/readme.txt +++ b/readme.txt @@ -85,8 +85,6 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process, All the "wait"-type APIs have a timeout-capable variant. - CHANGE: The old chEvtWait() and chEvtWaitTimeout() APIs are now deprecated and will be removed in version 1.0.0. -- CHANGE: Removed the CH_USE_EVENT_TIMEOUT configuration option in order to - make the chconf.h file simpler. - CHANGE: Modified chDbgAssert() to syntax check the condition even when the CH_USE_DEBUG is disabled, it produces no code but allows to check the optional code without have to compile twice. diff --git a/src/chevents.c b/src/chevents.c index f75a667e3..8aab8ca5c 100644 --- a/src/chevents.c +++ b/src/chevents.c @@ -146,6 +146,146 @@ void chEvtBroadcastI(EventSource *esp) { } } +/** + * Invokes the event handlers associated with a mask. + * @param mask mask of the events that should be invoked by the function, + * \p ALL_EVENTS enables all the sources + * @param handlers an array of \p evhandler_t. The array must be + * have indexes from zero up the higher registered event + * identifier. The array can be \p NULL or contain \p NULL + * elements (no callbacks specified). + */ +void chEvtDispatch(const evhandler_t handlers[], eventmask_t mask) { + eventid_t i; + eventmask_t m; + + i = 0, m = 1; + while ((mask & m) == 0) { + i += 1, m <<= 1; + mask &= ~m; + handlers[i](i); + } +} + +#if defined(CH_OPTIMIZE_SPEED) || !defined(CH_USE_EVENT_TIMEOUT) +/** + * A pending event among those specified in \p ewmask is selected, cleared and + * its mask returned. + * @param ewmask mask of the events that the function should wait for, + * \p ALL_EVENTS enables all the events + * @return The mask of the lowest id served and cleared event. + * @note Only a single event is served in the function, the one with the + * lowest event id. The function is meant to be invoked into a loop in + * order to serve all the pending events.
+ * This means that Event Listeners with a lower event identifier have + * an higher priority. + */ +eventmask_t chEvtWaitOne(eventmask_t ewmask) { + eventmask_t m; + + chSysLock(); + + if ((m = (currp->p_epending & ewmask)) == 0) { + currp->p_ewmask = ewmask; + chSchGoSleepS(PRWTOREVT); + m = currp->p_epending & ewmask; + } + m &= -m; + currp->p_epending &= ~m; + + chSysUnlock(); + return m; +} + +/** + * Waits for any of the specified events. + * The function waits for any event among those specified in \p ewmask to + * become pending then the events are cleared and returned. + * @param ewmask mask of the events that the function should wait for, + * \p ALL_EVENTS enables all the events + * @return The mask of the served and cleared events. + */ +eventmask_t chEvtWaitAny(eventmask_t ewmask) { + eventmask_t m; + + chSysLock(); + + if ((m = (currp->p_epending & ewmask)) == 0) { + currp->p_ewmask = ewmask; + chSchGoSleepS(PRWTOREVT); + m = currp->p_epending & ewmask; + } + currp->p_epending &= ~m; + + chSysUnlock(); + return m; +} + +/** + * Waits for all the specified event flags then clears them. + * The function waits for all the events specified in \p ewmask to become + * pending then the events are cleared and returned. + * @param ewmask mask of the event ids that the function should wait for + * @return The mask of the served and cleared events. + */ +eventmask_t chEvtWaitAll(eventmask_t ewmask) { + + chSysLock(); + + if ((currp->p_epending & ewmask) != ewmask) { + currp->p_ewmask = ewmask; + chSchGoSleepS(PRWTOREVT); + } + currp->p_epending &= ~ewmask; + + chSysUnlock(); + return ewmask; +} + +/** + * The function waits for an event and returns the event identifier, if an + * event handler is specified then the handler is executed before returning. + * @param ewmask mask of the events that should be served by the function, + * \p ALL_EVENTS enables all the sources + * @param handlers an array of \p evhandler_t. The array must be + * have indexes from zero up the higher registered event + * identifier. The array can be \p NULL or contain \p NULL + * elements (no callbacks specified). + * @return The event identifier. + * @note Only a single event is served in the function, the one with the + * lowest event id. The function is meant to be invoked into a loop so + * that all events are received and served.
+ * This means that Event Listeners with a lower event identifier have + * an higher priority. + * @deprecated Please use \p chEvtWaitOne() and \p chEvtDispatch() instead, + * this function will be removed in version 1.0.0. + */ +eventid_t chEvtWait(eventmask_t ewmask, + const evhandler_t handlers[]) { + eventid_t i; + eventmask_t m; + + chSysLock(); + + if ((currp->p_epending & ewmask) == 0) { + currp->p_ewmask = ewmask; + chSchGoSleepS(PRWTOREVT); + } + i = 0, m = 1; + while ((currp->p_epending & ewmask & m) == 0) + i += 1, m <<= 1; + currp->p_epending &= ~m; + + chSysUnlock(); + + if (handlers && handlers[i]) + handlers[i](i); + + return i; +} +#endif /* defined(CH_OPTIMIZE_SPEED) || !defined(CH_USE_EVENT_TIMEOUT) */ + +#ifdef CH_USE_EVENT_TIMEOUT /** * Waits for a single event. * A pending event among those specified in \p ewmask is selected, cleared and @@ -172,7 +312,6 @@ eventmask_t chEvtWaitOneTimeout(eventmask_t ewmask, systime_t time) { return (eventmask_t)0; m = currp->p_epending & ewmask; } -// m ^= m & (m - 1); m &= -m; currp->p_epending &= ~m; @@ -231,51 +370,6 @@ eventmask_t chEvtWaitAllTimeout(eventmask_t ewmask, systime_t time) { return ewmask; } -/** - * Invokes the event handlers associated with a mask. - * @param mask mask of the events that should be invoked by the function, - * \p ALL_EVENTS enables all the sources - * @param handlers an array of \p evhandler_t. The array must be - * have indexes from zero up the higher registered event - * identifier. The array can be \p NULL or contain \p NULL - * elements (no callbacks specified). - */ -void chEvtDispatch(const evhandler_t handlers[], eventmask_t mask) { - eventid_t i; - eventmask_t m; - - i = 0, m = 1; - while ((mask & m) == 0) { - i += 1, m <<= 1; - mask &= ~m; - handlers[i](i); - } -} - -/** - * The function waits for an event and returns the event identifier, if an - * event handler is specified then the handler is executed before returning. - * @param ewmask mask of the events that should be served by the function, - * \p ALL_EVENTS enables all the sources - * @param handlers an array of \p evhandler_t. The array must be - * have indexes from zero up the higher registered event - * identifier. The array can be \p NULL or contain \p NULL - * elements (no callbacks specified). - * @return The event identifier. - * @note Only a single event is served in the function, the one with the - * lowest event id. The function is meant to be invoked into a loop so - * that all events are received and served.
- * This means that Event Listeners with a lower event identifier have - * an higher priority. - * @deprecated Please use \p chEvtWaitOne() and \p chEvtDispatch() instead, - * this function will be removed in version 1.0.0. - */ -eventid_t chEvtWait(eventmask_t ewmask, - const evhandler_t handlers[]) { - - return chEvtWaitTimeout(ewmask, handlers, TIME_INFINITE); -} - /** * The function waits for an event or the specified timeout then returns the * event identifier, if an event handler is specified then the handler is @@ -322,6 +416,7 @@ eventid_t chEvtWaitTimeout(eventmask_t ewmask, return i; } +#endif /* CH_USE_EVENT_TIMEOUT */ #endif /* CH_USE_EVENTS */ diff --git a/src/include/events.h b/src/include/events.h index 47d898dad..6474dcf4a 100644 --- a/src/include/events.h +++ b/src/include/events.h @@ -83,6 +83,11 @@ extern "C" { void chEvtUnregister(EventSource *esp, EventListener *elp); eventmask_t chEvtClear(eventmask_t mask); eventmask_t chEvtPend(eventmask_t mask); +#if defined(CH_OPTIMIZE_SPEED) || !defined(CH_USE_EVENT_TIMEOUT) + eventmask_t chEvtWaitOne(eventmask_t ewmask); + eventmask_t chEvtWaitAny(eventmask_t ewmask); + eventmask_t chEvtWaitAll(eventmask_t ewmask); +#endif eventmask_t chEvtWaitOneTimeout(eventmask_t ewmask, systime_t time); eventmask_t chEvtWaitAnyTimeout(eventmask_t ewmask, systime_t time); eventmask_t chEvtWaitAllTimeout(eventmask_t ewmask, systime_t time); @@ -97,38 +102,12 @@ extern "C" { } #endif -/** - * A pending event among those specified in \p ewmask is selected, cleared and - * its mask returned. - * @param ewmask mask of the events that the function should wait for, - * \p ALL_EVENTS enables all the events - * @return The mask of the lowest id served and cleared event. - * @note Only a single event is served in the function, the one with the - * lowest event id. The function is meant to be invoked into a loop in - * order to serve all the pending events.
- * This means that Event Listeners with a lower event identifier have - * an higher priority. - */ +#if !defined(CH_OPTIMIZE_SPEED) && defined(CH_USE_EVENT_TIMEOUT) #define chEvtWaitOne(ewmask) chEvtWaitOneTimeout(ewmask, TIME_INFINITE) - -/** - * Waits for any of the specified events. - * The function waits for any event among those specified in \p ewmask to - * become pending then the events are cleared and returned. - * @param ewmask mask of the events that the function should wait for, - * \p ALL_EVENTS enables all the events - * @return The mask of the served and cleared events. - */ #define chEvtWaitAny(ewmask) chEvtWaitAnyTimeout(ewmask, TIME_INFINITE) - -/** - * Waits for all the specified event flags then clears them. - * The function waits for all the events specified in \p ewmask to become - * pending then the events are cleared and returned. - * @param ewmask mask of the event ids that the function should wait for - * @return The mask of the served and cleared events. - */ #define chEvtWaitAll(ewmask) chEvtWaitAllTimeout(ewmask, TIME_INFINITE) +#define chEvtWait(ewmask, handlers) chEvtWaitTimeout(ewmask, handlers, TIME_INFINITE) +#endif /* * Old function names, deprecated, will be removed in some next release. diff --git a/src/templates/chconf.h b/src/templates/chconf.h index 0be7e1d50..9e34e381f 100644 --- a/src/templates/chconf.h +++ b/src/templates/chconf.h @@ -64,6 +64,12 @@ * the kernel.*/ #define CH_USE_EVENTS +/** Configuration option: if specified then the \p chEvtWaitXXXTimeout() + * functions are included in the kernel. + * @note requires \p CH_USE_EVENTS. + */ +#define CH_USE_EVENTS_TIMEOUT + /** Configuration option: if specified then the Synchronous Messages APIs are * included in the kernel.*/ #define CH_USE_MESSAGES @@ -156,8 +162,8 @@ //#define CH_CURRP_REGISTER_CACHE "reg" /** Debug option: Includes basic debug support to the kernel. - * @note the debug support is port-dependent, it may be not present on some - * targets. In that case stub functions will be included. + * @note The debug support is port-dependent, it may be not present on some + * targets. In that case stub functions will be included. */ #define CH_USE_DEBUG