git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@504 35acf78f-673a-0410-8e92-d51de3d6d3f4

master
gdisirio 2008-11-09 09:31:17 +00:00
parent 5c923f28ba
commit 87d83b1b7e
7 changed files with 53 additions and 27 deletions

View File

@ -60,13 +60,17 @@ static msg_t Thread2(void *arg) {
return 0; return 0;
} }
static WorkingArea(waTestThread, 128);
/* /*
* Executed as event handler at 500mS intervals. * Executed as event handler at 500mS intervals.
*/ */
static void TimerHandler(eventid_t id) { static void TimerHandler(eventid_t id) {
if (!(IO0PIN & 0x00018000)) { // Both buttons if (!(IO0PIN & 0x00018000)) { // Both buttons
TestThread(&COM1); Thread *tp = chThdCreateStatic(waTestThread, sizeof(waTestThread),
NORMALPRIO, TestThread, &COM1);
chThdWait(tp);
PlaySound(500, 100); PlaySound(500, 100);
} }
else { else {

View File

@ -82,12 +82,14 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process,
* chEvtWaitAll() - Wait with AND condition. * chEvtWaitAll() - Wait with AND condition.
* chEvtDispatch() - Invokes the event handlers associated to a mask. * chEvtDispatch() - Invokes the event handlers associated to a mask.
* chEvtPend() - Quickly self-pends some events. * chEvtPend() - Quickly self-pends some events.
* chEvtRegisterMask() - Registers a set of flags on a single source.
All the "wait"-type APIs have a timeout-capable variant. All the "wait"-type APIs have a timeout-capable variant.
- CHANGE: The old chEvtWait() and chEvtWaitTimeout() APIs are now deprecated - CHANGE: The old chEvtWait() and chEvtWaitTimeout() APIs are now deprecated
and will be removed in version 1.0.0. and will be removed in version 1.0.0.
- CHANGE: Modified chDbgAssert() to syntax check the condition even when the - 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 CH_USE_DEBUG is disabled, it produces no code but allows to check the
optional code without have to compile twice. optional code without have to compile twice.
- FIX: Fixed a warning generated by the chEvtIsListening() macro.
- Added a new benchmark to the test suite (timers set/reset performance). - Added a new benchmark to the test suite (timers set/reset performance).
- Renamed the macro fifo_init() to queue_init() because it is used to init - Renamed the macro fifo_init() to queue_init() because it is used to init
both FIFO queues and priority queues. both FIFO queues and priority queues.

View File

@ -28,21 +28,18 @@
* Registers an Event Listener on an Event Source. * Registers an Event Listener on an Event Source.
* @param esp pointer to the \p EventSource structure * @param esp pointer to the \p EventSource structure
* @param elp pointer to the \p EventListener structure * @param elp pointer to the \p EventListener structure
* @param eid numeric identifier assigned to the Event Listener. The identifier * @param emask the mask of event flags to be pended to the thread when the
* is used as index for the event callback function. * event source is broadcasted
* The value must range between zero and the size, in bit, of the * @note Multiple Event Listeners can specify the same bits to be pended.
* \p eventid_t type minus one.
* @note Multiple Event Listeners can use the same event identifier, the
* listener will share the callback function.
*/ */
void chEvtRegister(EventSource *esp, EventListener *elp, eventid_t eid) { void chEvtRegisterMask(EventSource *esp, EventListener *elp, eventmask_t emask) {
chSysLock(); chSysLock();
elp->el_next = esp->es_next; elp->el_next = esp->es_next;
esp->es_next = elp; esp->es_next = elp;
elp->el_listener = currp; elp->el_listener = currp;
elp->el_id = eid; elp->el_mask = emask;
chSysUnlock(); chSysUnlock();
} }
@ -132,14 +129,11 @@ void chEvtBroadcastI(EventSource *esp) {
while (elp != (EventListener *)esp) { while (elp != (EventListener *)esp) {
Thread *tp = elp->el_listener; Thread *tp = elp->el_listener;
tp->p_epending |= EventMask(elp->el_id); tp->p_epending |= elp->el_mask;
/* Test on the AND/OR conditions wait states.*/ /* Test on the AND/OR conditions wait states.*/
if ((tp->p_state == PRWTOREVT) && if (((tp->p_state == PRWTOREVT) && ((tp->p_epending & tp->p_ewmask) != 0)) ||
((tp->p_epending & tp->p_ewmask) != 0)) ((tp->p_state == PRWTANDEVT) && ((tp->p_epending & tp->p_ewmask) == tp->p_ewmask)))
chSchReadyI(tp)->p_rdymsg = RDY_OK;
else if ((tp->p_state == PRWTANDEVT) &&
((tp->p_epending & tp->p_ewmask) == tp->p_ewmask))
chSchReadyI(tp)->p_rdymsg = RDY_OK; chSchReadyI(tp)->p_rdymsg = RDY_OK;
elp = elp->el_next; elp = elp->el_next;
@ -234,7 +228,7 @@ eventmask_t chEvtWaitAll(eventmask_t ewmask) {
if ((currp->p_epending & ewmask) != ewmask) { if ((currp->p_epending & ewmask) != ewmask) {
currp->p_ewmask = ewmask; currp->p_ewmask = ewmask;
chSchGoSleepS(PRWTOREVT); chSchGoSleepS(PRWTANDEVT);
} }
currp->p_epending &= ~ewmask; currp->p_epending &= ~ewmask;

View File

@ -40,8 +40,8 @@ struct EventListener {
EventListener *el_next; EventListener *el_next;
/** Thread interested in the Event Source.*/ /** Thread interested in the Event Source.*/
Thread *el_listener; Thread *el_listener;
/** Event identifier associated by the thread to the Event Source.*/ /** Event flags mask associated by the thread to the Event Source.*/
eventid_t el_id; eventmask_t el_mask;
}; };
/** /**
@ -70,7 +70,7 @@ typedef struct EventSource {
* @note Can be called with interrupts disabled or enabled. * @note Can be called with interrupts disabled or enabled.
*/ */
#define chEvtIsListening(esp) \ #define chEvtIsListening(esp) \
((esp) != (EventListener *)(void *)(esp)->es_next) ((void *)(esp) != (void *)(esp)->es_next)
/** Event Handler callback function.*/ /** Event Handler callback function.*/
@ -79,7 +79,7 @@ typedef void (*evhandler_t)(eventid_t);
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void chEvtRegister(EventSource *esp, EventListener *elp, eventid_t eid); void chEvtRegisterMask(EventSource *esp, EventListener *elp, eventmask_t emask);
void chEvtUnregister(EventSource *esp, EventListener *elp); void chEvtUnregister(EventSource *esp, EventListener *elp);
eventmask_t chEvtClear(eventmask_t mask); eventmask_t chEvtClear(eventmask_t mask);
eventmask_t chEvtPend(eventmask_t mask); eventmask_t chEvtPend(eventmask_t mask);
@ -104,6 +104,19 @@ extern "C" {
} }
#endif #endif
/**
* Registers an Event Listener on an Event Source.
* @param esp pointer to the \p EventSource structure
* @param elp pointer to the \p EventListener structure
* @param eid numeric identifier assigned to the Event Listener. The identifier
* is used as index for the event callback function.
* The value must range between zero and the size, in bit, of the
* \p eventid_t type minus one.
* @note Multiple Event Listeners can use the same event identifier, the
* listener will share the callback function.
*/
#define chEvtRegister(esp, elp, eid) chEvtRegisterMask(esp, elp, EventMask(eid))
#if !defined(CH_OPTIMIZE_SPEED) && defined(CH_USE_EVENT_TIMEOUT) #if !defined(CH_OPTIMIZE_SPEED) && defined(CH_USE_EVENT_TIMEOUT)
#define chEvtWaitOne(ewmask) chEvtWaitOneTimeout(ewmask, TIME_INFINITE) #define chEvtWaitOne(ewmask) chEvtWaitOneTimeout(ewmask, TIME_INFINITE)
#define chEvtWaitAny(ewmask) chEvtWaitAnyTimeout(ewmask, TIME_INFINITE) #define chEvtWaitAny(ewmask) chEvtWaitAnyTimeout(ewmask, TIME_INFINITE)

View File

@ -24,6 +24,7 @@
#include "testsem.h" #include "testsem.h"
#include "testmtx.h" #include "testmtx.h"
#include "testmsg.h" #include "testmsg.h"
#include "testevt.h"
#include "testheap.h" #include "testheap.h"
#include "testpools.h" #include "testpools.h"
#include "testdyn.h" #include "testdyn.h"
@ -35,14 +36,21 @@
static const struct testcase *tests[] = { static const struct testcase *tests[] = {
&testrdy1, &testrdy1,
&testrdy2, &testrdy2,
#ifdef CH_USE_SEMAPHORES
&testsem1, &testsem1,
&testsem2, &testsem2,
#endif
#ifdef CH_USE_MUTEXES #ifdef CH_USE_MUTEXES
&testmtx1, &testmtx1,
&testmtx2, &testmtx2,
&testmtx3, &testmtx3,
#endif #endif
#ifdef CH_USE_MESSAGES
&testmsg1, &testmsg1,
#endif
#ifdef CH_USE_EVENTS
&testevt1,
#endif
#ifdef CH_USE_HEAP #ifdef CH_USE_HEAP
&testheap1, &testheap1,
#endif #endif

View File

@ -1,4 +1,5 @@
# List of all the ChibiOS/RT test files. # List of all the ChibiOS/RT test files.
TESTSRC = ../../test/test.c ../../test/testrdy.c ../../test/testsem.c \ TESTSRC = ../../test/test.c ../../test/testrdy.c ../../test/testsem.c \
../../test/testmtx.c ../../test/testmsg.c ../../test/testheap.c \ ../../test/testmtx.c ../../test/testmsg.c ../../test/testevt.c \
../../test/testpools.c ../../test/testdyn.c ../../test/testbmk.c ../../test/testheap.c ../../test/testpools.c ../../test/testdyn.c \
../../test/testbmk.c

View File

@ -21,6 +21,8 @@
#include "test.h" #include "test.h"
#ifdef CH_USE_SEMAPHORES
#define ALLOWED_DELAY MS2ST(5) #define ALLOWED_DELAY MS2ST(5)
static Semaphore sem1; static Semaphore sem1;
@ -100,3 +102,5 @@ const struct testcase testsem2 = {
sem2_teardown, sem2_teardown,
sem2_execute sem2_execute
}; };
#endif /* CH_USE_SEMAPHORES */