From 5f794074e4aba1d43889c230dcdded00fde1bd16 Mon Sep 17 00:00:00 2001 From: Rahix <rahix@rahix.de> Date: Wed, 14 Aug 2019 22:14:09 +0200 Subject: [PATCH] chore(epicardium): Move dispatcher into own module Also add a mutex around API calls in preparation for future changes. Signed-off-by: Rahix <rahix@rahix.de> --- epicardium/main.c | 15 --------------- epicardium/modules/dispatcher.c | 34 +++++++++++++++++++++++++++++++++ epicardium/modules/meson.build | 1 + epicardium/modules/modules.h | 9 ++++++++- 4 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 epicardium/modules/dispatcher.c diff --git a/epicardium/main.c b/epicardium/main.c index 84abf8d9..cd989f4c 100644 --- a/epicardium/main.c +++ b/epicardium/main.c @@ -31,21 +31,6 @@ TaskHandle_t dispatcher_task_id; void vBleTask(void *pvParameters); -/* - * API dispatcher task. This task will sleep until an API call is issued and - * then wake up to dispatch it. - */ -void vApiDispatcher(void *pvParameters) -{ - LOG_DEBUG("dispatcher", "Ready."); - while (1) { - if (api_dispatcher_poll()) { - api_dispatcher_exec(); - } - ulTaskNotifyTake(pdTRUE, portMAX_DELAY); - } -} - int main(void) { LOG_INFO("startup", "Epicardium startup ..."); diff --git a/epicardium/modules/dispatcher.c b/epicardium/modules/dispatcher.c new file mode 100644 index 00000000..60f1c1f8 --- /dev/null +++ b/epicardium/modules/dispatcher.c @@ -0,0 +1,34 @@ +#include "modules/log.h" + +#include "api/dispatcher.h" + +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +#define TIMEOUT pdMS_TO_TICKS(2000) + +static StaticSemaphore_t api_mutex_data; +SemaphoreHandle_t api_mutex = NULL; + +/* + * API dispatcher task. This task will sleep until an API call is issued and + * then wake up to dispatch it. + */ +void vApiDispatcher(void *pvParameters) +{ + api_mutex = xSemaphoreCreateMutexStatic(&api_mutex_data); + + LOG_DEBUG("dispatcher", "Ready."); + while (1) { + if (api_dispatcher_poll()) { + if (xSemaphoreTake(api_mutex, TIMEOUT) != pdTRUE) { + LOG_ERR("dispatcher", "API mutex blocked"); + continue; + } + api_dispatcher_exec(); + xSemaphoreGive(api_mutex); + } + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + } +} diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build index b3cf4eb2..9a70957d 100644 --- a/epicardium/modules/meson.build +++ b/epicardium/modules/meson.build @@ -1,4 +1,5 @@ module_sources = files( + 'dispatcher.c', 'display.c', 'fileops.c', 'leds.c', diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index 4a7bc255..ea2a313f 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -1,12 +1,19 @@ #ifndef MODULES_H #define MODULES_H +#include "FreeRTOS.h" +#include "semphr.h" + #include <stdint.h> +/* ---------- Dispatcher --------------------------------------------------- */ +void vApiDispatcher(void *pvParameters); +extern SemaphoreHandle_t api_mutex; +extern TaskHandle_t dispatcher_task_id; + /* ---------- Serial ------------------------------------------------------- */ #define SERIAL_READ_BUFFER_SIZE 128 void vSerialTask(void *pvParameters); - void serial_enqueue_char(char chr); /* ---------- PMIC --------------------------------------------------------- */ -- GitLab