X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fmware%2Fevent.h;h=0a87af1abe170dbf58a80156477c0b80135ec715;hb=9525bb5f7e0bf15bd0b11a21055adf804c6aa478;hp=e640105669490d7d7c25d8c5f731202ac5098f83;hpb=1e5e45887029f15c8a3ea43edf162ed93d3f25b1;p=bertos.git diff --git a/bertos/mware/event.h b/bertos/mware/event.h index e6401056..0a87af1a 100644 --- a/bertos/mware/event.h +++ b/bertos/mware/event.h @@ -30,12 +30,15 @@ * Copyright 1999, 2001, 2003 Bernie Innocenti * --> * + * \defgroup event_handling Event handling module + * \ingroup core + * \{ + * * \brief Events handling * * This module implements a common system for executing * a user defined action calling a hook function. * - * NOTE: Generic completion events * * Device drivers often need to wait the completion of some event, usually to * allow the hardware to accomplish some asynchronous task. @@ -64,7 +67,7 @@ * behaviour with or without the kernel. * * Example usage (wait for a generic device driver initialization): - * \verbatim + * \code * static Event e; * * static void irq_handler(void) @@ -82,7 +85,7 @@ * // Wait for the completion of the event * event_wait(&e); * } - * \endverbatim + * \endcode * * \author Bernie Innocenti */ @@ -106,7 +109,6 @@ struct Process; #endif - /// User defined callback type typedef void (*Hook)(void *); @@ -186,15 +188,6 @@ INLINE Event event_createSignal(struct Process *proc, sigbit_t bit) #endif -/** - * Prevent the compiler from optimizing access to the variable \a x, enforcing - * a refetch from memory. This also forbid from reordering successing instances - * of ACCESS_SAFE(). - * - * TODO: move this to cfg/compiler.h - */ -#define ACCESS_SAFE(x) (*(volatile typeof(x) *)&(x)) - #if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS /** Initialize the generic sleepable event \a e */ #define event_initGeneric(e) \ @@ -218,6 +211,10 @@ INLINE Event event_createGeneric(void) /** * Wait the completion of event \a e. + * + * This function releases the CPU the application is configured to use + * the kernel, otherwise it's just a busy wait. + * \note It's forbidden to use this function inside irq handling functions. */ INLINE void event_wait(Event *e) { @@ -241,33 +238,44 @@ INLINE void event_wait(Event *e) /** * Wait the completion of event \a e or \a timeout elapses. + * + * \note It's forbidden to use this function inside irq handling functions. */ INLINE bool event_waitTimeout(Event *e, ticks_t timeout) { + bool ret; + #if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS e->Ev.Sig.sig_proc = proc_current(); - return (sig_waitTimeout(e->Ev.Sig.sig_bit, timeout) & SIG_TIMEOUT) ? + ret = (sig_waitTimeout(e->Ev.Sig.sig_bit, timeout) & SIG_TIMEOUT) ? false : true; #else ticks_t end = timer_clock() + timeout; - bool ret; while ((ACCESS_SAFE(e->Ev.Gen.completed) == false) || TIMER_AFTER(timer_clock(), end)) cpu_relax(); ret = e->Ev.Gen.completed; e->Ev.Gen.completed = false; +#endif MEMORY_BARRIER; - return ret; -#endif } #endif /* CONFIG_TIMER_EVENTS */ -/** Trigger an event */ +/** + * Trigger an event. + * + * Execute the callback function associated with event \a e. + * + * This function can be used also in interrupt routines, but only if the + * event was created as a signal or generic event. + */ INLINE void event_do(struct Event *e) { e->action(e); } +/** \} */ + #endif /* KERN_EVENT_H */