Merge pull request #13373 from haukepetersen/add_event_timeout64
sys/event: add event_wait_timeout64()
This commit is contained in:
commit
2c41f762b0
@ -115,14 +115,12 @@ event_t *event_wait(event_queue_t *queue)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MODULE_XTIMER
|
#ifdef MODULE_XTIMER
|
||||||
event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout)
|
static event_t *_wait_timeout(event_queue_t *queue, xtimer_t *timer)
|
||||||
{
|
{
|
||||||
assert(queue);
|
assert(queue);
|
||||||
event_t *result;
|
event_t *result;
|
||||||
xtimer_t timer;
|
|
||||||
thread_flags_t flags = 0;
|
thread_flags_t flags = 0;
|
||||||
|
|
||||||
xtimer_set_timeout_flag(&timer, timeout);
|
|
||||||
do {
|
do {
|
||||||
result = event_get(queue);
|
result = event_get(queue);
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
@ -131,11 +129,27 @@ event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout)
|
|||||||
} while ((result == NULL) && (flags & THREAD_FLAG_EVENT));
|
} while ((result == NULL) && (flags & THREAD_FLAG_EVENT));
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
xtimer_remove(&timer);
|
xtimer_remove(timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout)
|
||||||
|
{
|
||||||
|
xtimer_t timer;
|
||||||
|
|
||||||
|
xtimer_set_timeout_flag(&timer, timeout);
|
||||||
|
return _wait_timeout(queue, &timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
event_t *event_wait_timeout64(event_queue_t *queue, uint64_t timeout)
|
||||||
|
{
|
||||||
|
xtimer_t timer;
|
||||||
|
|
||||||
|
xtimer_set_timeout_flag64(&timer, timeout);
|
||||||
|
return _wait_timeout(queue, &timer);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void event_loop(event_queue_t *queue)
|
void event_loop(event_queue_t *queue)
|
||||||
|
|||||||
@ -242,6 +242,17 @@ event_t *event_wait(event_queue_t *queue);
|
|||||||
* @return NULL if timeout expired before an event was posted
|
* @return NULL if timeout expired before an event was posted
|
||||||
*/
|
*/
|
||||||
event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout);
|
event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get next event from event queue, blocking until timeout expires
|
||||||
|
*
|
||||||
|
* @param[in] queue queue to query for an event
|
||||||
|
* @param[in] timeout maximum time to wait for an event to be posted in us
|
||||||
|
*
|
||||||
|
* @return pointer to next event if event was taken from the queue
|
||||||
|
* @return NULL if timeout expired before an event was posted
|
||||||
|
*/
|
||||||
|
event_t *event_wait_timeout64(event_queue_t *queue, uint64_t timeout);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
#include "xtimer.h"
|
#include "xtimer.h"
|
||||||
#include "thread_flags.h"
|
#include "thread_flags.h"
|
||||||
|
|
||||||
|
#define STATIC_TIMEOUT (10U * US_PER_MS) /* 10ms */
|
||||||
#define TIMEOUT (50U * US_PER_MS) /* 50ms */
|
#define TIMEOUT (50U * US_PER_MS) /* 50ms */
|
||||||
#define PRIO (THREAD_PRIORITY_MAIN - 5)
|
#define PRIO (THREAD_PRIORITY_MAIN - 5)
|
||||||
#define STACKSIZE (THREAD_STACKSIZE_DEFAULT)
|
#define STACKSIZE (THREAD_STACKSIZE_DEFAULT)
|
||||||
@ -80,6 +81,33 @@ int main(void)
|
|||||||
puts("[FAILED]");
|
puts("[FAILED]");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
tmp_evt = event_wait_timeout64(&tmp_eq, 0);
|
||||||
|
if (tmp_evt != NULL) {
|
||||||
|
puts("[FAILED]");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* test return in a predefined amount of time */
|
||||||
|
puts("waiting for event with 10ms timeout...");
|
||||||
|
uint32_t before = xtimer_now_usec();
|
||||||
|
tmp_evt = event_wait_timeout(&tmp_eq, STATIC_TIMEOUT);
|
||||||
|
if (tmp_evt != NULL) {
|
||||||
|
puts("[FAILED]");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
uint32_t diff = xtimer_now_usec() - before;
|
||||||
|
printf("event_wait time out after %"PRIu32"us\n", diff);
|
||||||
|
|
||||||
|
puts("waiting for event with 10ms timeout (using uint64)...");
|
||||||
|
uint64_t static_timeout = STATIC_TIMEOUT;
|
||||||
|
before = xtimer_now_usec();
|
||||||
|
tmp_evt = event_wait_timeout64(&tmp_eq, static_timeout);
|
||||||
|
if (tmp_evt != NULL) {
|
||||||
|
puts("[FAILED]");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
diff = xtimer_now_usec() - before;
|
||||||
|
printf("event_wait time out after %"PRIu32"us\n", diff);
|
||||||
|
|
||||||
thread_create(_stack, sizeof(_stack), PRIO, 0, _cnt_thread, NULL, "cnt");
|
thread_create(_stack, sizeof(_stack), PRIO, 0, _cnt_thread, NULL, "cnt");
|
||||||
/* first, wait 155ms -> should lead to 3 timeout wakeups */
|
/* first, wait 155ms -> should lead to 3 timeout wakeups */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user