From 5ac4d3949cd7430e0d4c994bbc528e8e4fa91337 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 22 May 2023 15:23:51 +1000 Subject: Generalise worker tasks, and centralise task priorities + stacks Includes making the display driver use a worker task for flushes, so that our double buffering actually does something useful /facepalm --- src/database/db_task.cpp | 91 ------------------------------------------------ 1 file changed, 91 deletions(-) delete mode 100644 src/database/db_task.cpp (limited to 'src/database/db_task.cpp') diff --git a/src/database/db_task.cpp b/src/database/db_task.cpp deleted file mode 100644 index 5b4b34b5..00000000 --- a/src/database/db_task.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "db_task.hpp" - -#include - -#include "esp_heap_caps.h" -#include "freertos/FreeRTOS.h" -#include "freertos/portmacro.h" -#include "freertos/projdefs.h" -#include "freertos/queue.h" -#include "freertos/task.h" - -namespace database { - -static const std::size_t kDbStackSize = 256 * 1024; -static StaticTask_t sDbStaticTask; -static StackType_t* sDbStack = nullptr; - -static std::atomic sTaskRunning(false); -static QueueHandle_t sWorkQueue; - -struct WorkItem { - std::function* fn; - bool quit; -}; - -auto SendToDbTask(std::function fn) -> void { - WorkItem item{ - .fn = new std::function(fn), - .quit = false, - }; - xQueueSend(sWorkQueue, &item, portMAX_DELAY); -} - -template <> -auto RunOnDbTask(std::function fn) -> std::future { - std::shared_ptr> promise = - std::make_shared>(); - SendToDbTask([=]() { - std::invoke(fn); - promise->set_value(); - }); - return promise->get_future(); -} - -void DatabaseTaskMain(void* args) { - while (true) { - WorkItem item; - if (xQueueReceive(sWorkQueue, &item, portMAX_DELAY)) { - if (item.fn != nullptr) { - std::invoke(*item.fn); - delete item.fn; - } - if (item.quit) { - break; - } - } - } - vQueueDelete(sWorkQueue); - sTaskRunning.store(false); - vTaskDelete(NULL); -} - -auto StartDbTask() -> bool { - if (sTaskRunning.exchange(true)) { - return false; - } - if (sDbStack == nullptr) { - sDbStack = reinterpret_cast( - heap_caps_malloc(kDbStackSize, MALLOC_CAP_SPIRAM)); - } - sWorkQueue = xQueueCreate(8, sizeof(WorkItem)); - xTaskCreateStatic(&DatabaseTaskMain, "DB", kDbStackSize, NULL, 1, sDbStack, - &sDbStaticTask); - return true; -} - -auto QuitDbTask() -> void { - if (!sTaskRunning.load()) { - return; - } - WorkItem item{ - .fn = nullptr, - .quit = true, - }; - xQueueSend(sWorkQueue, &item, portMAX_DELAY); - while (sTaskRunning.load()) { - vTaskDelay(pdMS_TO_TICKS(1)); - } -} - -} // namespace database -- cgit v1.2.3