mware: add generic completion events
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 1 Oct 2010 17:32:17 +0000 (17:32 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 1 Oct 2010 17:32:17 +0000 (17:32 +0000)
commit0f9fefdfa8adc711290fa202060b3629aae574b8
tree70ed3d03209d8759032d05c5a60b4a8c84eb9a08
parent12b52c42097e3f0144bac3c56d374b7a0666ab40
mware: add generic completion events

Device drivers often need to wait the completion of some event, usually to
allow the hardware to accomplish some asynchronous task.

A common approach is to place a busy wait with a cpu_relax() loop that invokes
the architecture-specific instructions to say that we're not doing much with
the processor.

Although technically correct, the busy loop degrades the overall system
performance in presence of multiple processes and power consumption.

With the kernel the natural way to implement such wait/complete mechanism is to
use signals via sig_wait() and sig_post()/sig_send().

However, signals in BeRTOS are only available in presence of the kernel (that
is just a compile-time option). This means that each device driver must provide
two different interfaces to implement the wait/complete semantic: one with the
kernel and another without the kernel.

The purpose of the completion events is to provide a generic interface to
implement a synchronization mechanism to block the execution of code until a
specific event happens.

This interface does not depend on the presence of the kernel and it
automatically uses the appropriate event backend to provide the same
behaviour with or without the kernel.

Example usage:
---------------------------------------------------------------------
static Event e;

static void irq_handler(void)
{
/* Completion event has happened, resume the execution of init() */
event_do(&e);
}

static void init(void)
{
/* Declare a generic completion event */
event_initGeneric(&e);
/* Submit the hardware initialization request */
async_hw_init();
/* Wait for the completion of the event */
event_wait(&e);
}
---------------------------------------------------------------------

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4392 38d2e660-2303-0410-9eaa-f027e97ec537
bertos/mware/event.c
bertos/mware/event.h