From 98e9e11355a6d0deea730fb50d14f2f41da6ae1f Mon Sep 17 00:00:00 2001 From: RedHawk Date: Tue, 25 Apr 2023 23:57:18 +0300 Subject: [PATCH 1/4] QueueManager & Master: Base for queues. --- source/shoh/src/main.cpp | 17 +++++++++- .../shoh/src/threads/common/QueueManager.cpp | 32 +++++++++++++++++++ source/shoh/src/threads/common/ThreadCommon.h | 21 ++++++++++++ source/shoh/src/threads/master/Master.cpp | 12 +++++-- source/shoh/src/threads/master/Master.h | 3 +- 5 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 source/shoh/src/threads/common/QueueManager.cpp diff --git a/source/shoh/src/main.cpp b/source/shoh/src/main.cpp index 81ea5a8..c226edb 100644 --- a/source/shoh/src/main.cpp +++ b/source/shoh/src/main.cpp @@ -12,9 +12,24 @@ int main(void) SystemCoreClockUpdate(); Board_Init(); ThreadCommon::ThreadManager manager; + ThreadCommon::QueueManager* qmanager = new ThreadCommon::QueueManager; + //Creating queues + qmanager->createQueue(100, + sizeof(ThreadCommon::Event), + ThreadCommon::QueueManager::master_event_all); + + //Creating tasks manager.createTask(master_thread, "master", configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, - nullptr); + static_cast(qmanager)); + + // + QueueHandle_t master_event_all_q = qmanager->getQueue(ThreadCommon::QueueManager::master_event_all); + ThreadCommon::Event* e = new ThreadCommon::Event(ThreadCommon::Null, 0); + + xQueueSend(master_event_all_q, static_cast(e), 0); + // + // Start the real time kernel with preemption. //FreeRTOS::Kernel::startScheduler(); vTaskStartScheduler (); diff --git a/source/shoh/src/threads/common/QueueManager.cpp b/source/shoh/src/threads/common/QueueManager.cpp new file mode 100644 index 0000000..8f4c42a --- /dev/null +++ b/source/shoh/src/threads/common/QueueManager.cpp @@ -0,0 +1,32 @@ +/* + * QueueManager.cpp + * + * Created on: 24 Apr 2023 + * Author: tylen + */ + +#include "ThreadCommon.h" + +ThreadCommon::QueueManager::QueueManager() {} + +bool ThreadCommon::QueueManager::createQueue(size_t queue_length, size_t item_size, Queue_id qid) +{ + QueueHandle_t queue_to_create; + if ((queue_to_create = xQueueCreate(queue_length, item_size))) + { + queues.insert({qid, queue_to_create}); + return true; + } + return false; +} + +QueueHandle_t ThreadCommon::QueueManager::getQueue(Queue_id qid) +{ + const auto pos = queues.find(qid); + if (pos == queues.end()) + return nullptr; + + return pos->second; + + //return queues.at(qid); +} diff --git a/source/shoh/src/threads/common/ThreadCommon.h b/source/shoh/src/threads/common/ThreadCommon.h index d8fe51f..071e2ab 100644 --- a/source/shoh/src/threads/common/ThreadCommon.h +++ b/source/shoh/src/threads/common/ThreadCommon.h @@ -11,6 +11,7 @@ #include "board.h" #include "FreeRTOS.h" #include +#include #include "queue.h" #include "task.h" #include @@ -19,6 +20,7 @@ namespace ThreadCommon { typedef enum EventType { + Null, Rotary, Temperature, Manager @@ -61,12 +63,31 @@ namespace ThreadCommon private: }; + class QueueManager + { + public: + enum Queue_id { + master_event_all, + relay_event_master, + manager_event_master, + ui_event_manager + }; + QueueManager(); + ~QueueManager() = default; + bool createQueue(size_t queue_length, size_t item_size, Queue_id qid); + QueueHandle_t getQueue(Queue_id qid); + private: + std::map queues; + }; + /* global variables */ /* 'receiver'_'what'_'sender'_q */ + /* extern QueueHandle_t master_event_all_q; extern QueueHandle_t relay_event_master_q; extern QueueHandle_t manager_event_master_q; extern QueueHandle_t ui_event_manager_q; + */ } #endif /*__THREAD_COMMON_H_*/ diff --git a/source/shoh/src/threads/master/Master.cpp b/source/shoh/src/threads/master/Master.cpp index 1ef3bc0..5549398 100644 --- a/source/shoh/src/threads/master/Master.cpp +++ b/source/shoh/src/threads/master/Master.cpp @@ -7,10 +7,18 @@ #include "Master.h" +Master::Master(ThreadCommon::QueueManager* qm) : _qm(qm) +{ + +} + void Master::taskFunction() { + QueueHandle_t master_event_all_q = _qm->getQueue(ThreadCommon::QueueManager::master_event_all); + ThreadCommon::Event* data; int led = 0; bool LedState = true; for (;;) { + xQueueReceive(master_event_all_q, static_cast(data), portMAX_DELAY); Board_LED_Set(led, LedState); LedState = (bool) !LedState; led++; @@ -23,6 +31,6 @@ void Master::taskFunction() { void master_thread(void* pvParams) { - Master m; + Master m(static_cast(pvParams)); m.taskFunction(); -} \ No newline at end of file +} diff --git a/source/shoh/src/threads/master/Master.h b/source/shoh/src/threads/master/Master.h index bcc173d..303cf59 100644 --- a/source/shoh/src/threads/master/Master.h +++ b/source/shoh/src/threads/master/Master.h @@ -16,7 +16,7 @@ class Master { public: - Master(){}; + Master(ThreadCommon::QueueManager* qm); virtual ~Master() = default; void taskFunction(); @@ -24,6 +24,7 @@ public: //Master& operator=(Master&&) noexcept = default; private: ThreadCommon::Event* message; + ThreadCommon::QueueManager* _qm; }; void master_thread(void* pvParams); From 34f6b5b694f5368af042ef7045589e25692434a4 Mon Sep 17 00:00:00 2001 From: RedHawk Date: Wed, 26 Apr 2023 00:03:13 +0300 Subject: [PATCH 2/4] Master.cpp: Fixing uninitialised memory. --- source/shoh/src/threads/master/Master.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/shoh/src/threads/master/Master.cpp b/source/shoh/src/threads/master/Master.cpp index 5549398..3f7a9cc 100644 --- a/source/shoh/src/threads/master/Master.cpp +++ b/source/shoh/src/threads/master/Master.cpp @@ -14,11 +14,11 @@ Master::Master(ThreadCommon::QueueManager* qm) : _qm(qm) void Master::taskFunction() { QueueHandle_t master_event_all_q = _qm->getQueue(ThreadCommon::QueueManager::master_event_all); - ThreadCommon::Event* data; + ThreadCommon::Event data(ThreadCommon::Null, 0); int led = 0; bool LedState = true; for (;;) { - xQueueReceive(master_event_all_q, static_cast(data), portMAX_DELAY); + xQueueReceive(master_event_all_q, static_cast(&data), portMAX_DELAY); Board_LED_Set(led, LedState); LedState = (bool) !LedState; led++; From 4a553e30935d44558c90e22acccb4e5c6afb28ba Mon Sep 17 00:00:00 2001 From: Vasily Davydov Date: Wed, 26 Apr 2023 00:56:18 +0300 Subject: [PATCH 3/4] queue-manager: wrap send & receive --- source/shoh/src/main.cpp | 2 +- source/shoh/src/threads/common/ThreadCommon.h | 15 +++++++++++++++ source/shoh/src/threads/master/Master.cpp | 3 +-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/source/shoh/src/main.cpp b/source/shoh/src/main.cpp index c226edb..d49e58c 100644 --- a/source/shoh/src/main.cpp +++ b/source/shoh/src/main.cpp @@ -27,7 +27,7 @@ int main(void) QueueHandle_t master_event_all_q = qmanager->getQueue(ThreadCommon::QueueManager::master_event_all); ThreadCommon::Event* e = new ThreadCommon::Event(ThreadCommon::Null, 0); - xQueueSend(master_event_all_q, static_cast(e), 0); + qmanager->send(ThreadCommon::QueueManager::master_event_all, e, 1000); // // Start the real time kernel with preemption. diff --git a/source/shoh/src/threads/common/ThreadCommon.h b/source/shoh/src/threads/common/ThreadCommon.h index 071e2ab..be6b149 100644 --- a/source/shoh/src/threads/common/ThreadCommon.h +++ b/source/shoh/src/threads/common/ThreadCommon.h @@ -76,6 +76,21 @@ namespace ThreadCommon ~QueueManager() = default; bool createQueue(size_t queue_length, size_t item_size, Queue_id qid); QueueHandle_t getQueue(Queue_id qid); + template bool send(Queue_id qid, T* data, TickType_t timeout){ + QueueHandle_t q = this->getQueue(qid); + BaseType_t qCheck = xQueueSend(q, + static_cast(data), + timeout); + return (qCheck == pdTRUE); + } + template bool receive(Queue_id qid, T* data, TickType_t timeout){ + QueueHandle_t q = this->getQueue(qid); + BaseType_t qCheck = xQueueReceive(q, + static_cast(data), + timeout); + return (qCheck == pdTRUE); + } + private: std::map queues; }; diff --git a/source/shoh/src/threads/master/Master.cpp b/source/shoh/src/threads/master/Master.cpp index 3f7a9cc..411baaa 100644 --- a/source/shoh/src/threads/master/Master.cpp +++ b/source/shoh/src/threads/master/Master.cpp @@ -13,12 +13,11 @@ Master::Master(ThreadCommon::QueueManager* qm) : _qm(qm) } void Master::taskFunction() { - QueueHandle_t master_event_all_q = _qm->getQueue(ThreadCommon::QueueManager::master_event_all); ThreadCommon::Event data(ThreadCommon::Null, 0); int led = 0; bool LedState = true; for (;;) { - xQueueReceive(master_event_all_q, static_cast(&data), portMAX_DELAY); + _qm->receive(ThreadCommon::QueueManager::master_event_all, &data, portMAX_DELAY); Board_LED_Set(led, LedState); LedState = (bool) !LedState; led++; From ad4a1009898ec80adda4ab6c31d0c5ec8a76b814 Mon Sep 17 00:00:00 2001 From: Vasily Davydov Date: Wed, 26 Apr 2023 01:03:40 +0300 Subject: [PATCH 4/4] thread-manager: create on heap Add a simple queue-manager test --- source/shoh/src/main.cpp | 6 +++--- source/shoh/src/threads/master/Master.cpp | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/source/shoh/src/main.cpp b/source/shoh/src/main.cpp index d49e58c..7558463 100644 --- a/source/shoh/src/main.cpp +++ b/source/shoh/src/main.cpp @@ -11,7 +11,7 @@ int main(void) { SystemCoreClockUpdate(); Board_Init(); - ThreadCommon::ThreadManager manager; + ThreadCommon::ThreadManager* manager = new ThreadCommon::ThreadManager; ThreadCommon::QueueManager* qmanager = new ThreadCommon::QueueManager; //Creating queues qmanager->createQueue(100, @@ -19,13 +19,13 @@ int main(void) ThreadCommon::QueueManager::master_event_all); //Creating tasks - manager.createTask(master_thread, "master", + manager->createTask(master_thread, "master", configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, static_cast(qmanager)); // QueueHandle_t master_event_all_q = qmanager->getQueue(ThreadCommon::QueueManager::master_event_all); - ThreadCommon::Event* e = new ThreadCommon::Event(ThreadCommon::Null, 0); + ThreadCommon::Event* e = new ThreadCommon::Event(ThreadCommon::Rotary, 1); qmanager->send(ThreadCommon::QueueManager::master_event_all, e, 1000); // diff --git a/source/shoh/src/threads/master/Master.cpp b/source/shoh/src/threads/master/Master.cpp index 411baaa..e986e74 100644 --- a/source/shoh/src/threads/master/Master.cpp +++ b/source/shoh/src/threads/master/Master.cpp @@ -18,13 +18,9 @@ void Master::taskFunction() { bool LedState = true; for (;;) { _qm->receive(ThreadCommon::QueueManager::master_event_all, &data, portMAX_DELAY); - Board_LED_Set(led, LedState); - LedState = (bool) !LedState; - led++; - if(led > 2){ - led = 0; + if(data.getData() == 1 && data.getType() == ThreadCommon::EventType::Rotary){ + Board_LED_Set(led, LedState); } - vTaskDelay(1000); } }