git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@504 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
5c923f28ba
commit
87d83b1b7e
|
@ -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 {
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue