From fe8711bc4ef8950c5c272d13c3820c2d012042e0 Mon Sep 17 00:00:00 2001 From: Hauke Petersen Date: Thu, 17 Oct 2019 09:30:25 +0200 Subject: [PATCH] demonstrator: take on shared event handler threads --- sys/include/tasklet.h | 25 +++++++++++++++++++++++++ sys/include/tasklet_param.h | 35 +++++++++++++++++++++++++++++++++++ sys/tasklet/tasklet.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 sys/include/tasklet.h create mode 100644 sys/include/tasklet_param.h create mode 100644 sys/tasklet/tasklet.c diff --git a/sys/include/tasklet.h b/sys/include/tasklet.h new file mode 100644 index 000000000000..81b516157ae4 --- /dev/null +++ b/sys/include/tasklet.h @@ -0,0 +1,25 @@ + + + + +#include + +#include "event.h" + + +typedef struct { + uint8_t prio; + char *stack; + size_t stack_size; +} tasklet_params_t; + + +void auto_init_tasklet(void); +event_queue_t *tasklet_get(unsigned n); + +/* for syntactic sugar, we could discuss to add some (none overhead) wrappers */ +static inline tasklet_schedule(unsgined n, event_t *evt) +{ + even_post(tasklet_get(n), evt); +} +// and so on... diff --git a/sys/include/tasklet_param.h b/sys/include/tasklet_param.h new file mode 100644 index 000000000000..f30d67bc9ee9 --- /dev/null +++ b/sys/include/tasklet_param.h @@ -0,0 +1,35 @@ + +#include "tasklet.h" + +#ifdef MODULE_TASKLET_HIGHPRIO +static char _stack_t1[SOME_STACK_SIZE]; +#endif + +#ifdef MODULE_TASKLET_LOWPRIO +static char _stack_t2[SOME_OTHER_STACK_SIZE]; + +/* syntactic sugar: we could give some names - however, we need to find a better + * way to do this non statically depending on the actual selected modules... */ +#define TASKLET_LOWPRIO (1u) /* position in params array */ +#endif + + + +static tasklet_params_t tasklet_params[] = { +#ifdef MODULE_TASKLET_HIGHPRIO + { + .prio = (THREAD_PRIORITY_HIGHEST + 1), + .stack = _stack_t1, + .stack_size = sizeof(stack_t1), + + }, +#endif +#ifdef MODULE_TASKLET_LOWPRIO + { + .prio = (THREAD_PRIORITY_IDLE - 1), + .stack = _stack_t2, + .stack_size = sizeof(stack_t2), + + }, +#endif +} diff --git a/sys/tasklet/tasklet.c b/sys/tasklet/tasklet.c new file mode 100644 index 000000000000..ba8208765f44 --- /dev/null +++ b/sys/tasklet/tasklet.c @@ -0,0 +1,28 @@ + +#include "thread.h" +#include "event.h" +#include "tasklet.h" +#include "tasklet_params.h" + + +static event_queue_t _eqs[ARRAY_SIZE(tasklet_params)]; + +static void *_runner(void *arg) +{ + event_queue_init((event_queue_t *)arg); + event_loop((event_queue_t *)arg); + return NULL; +} + +void auto_init_tasklet(void) +{ + for (unsigned i = 0; i < ARRAY_SIZE(tasklet_params); i++) { + thread_create(tasklet_params.stack, ... , _runner, &_eqs[i]); + } +} + +void tasklet_get(unsigned n) +{ + assert(n <= ARRAY_SIZE(tasklet_params)); + return &_eqs[n]; +}