thread-manager: create master task with manager

This commit is contained in:
Vasily Davydov 2023-04-25 22:47:31 +03:00
parent f85bf8ef8d
commit 927409d2a8
5 changed files with 61 additions and 27 deletions

View File

@ -3,15 +3,18 @@
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
#include <cr_section_macros.h> #include <cr_section_macros.h>
#include "common/ThreadCommon.h"
#include "Master.h" #include "Master.h"
int main(void) int main(void)
{ {
SystemCoreClockUpdate(); SystemCoreClockUpdate();
Board_Init(); Board_Init();
// Create a task before starting the scheduler. ThreadCommon::ThreadManager manager;
Master master("Master", configMINIMAL_STACK_SIZE * 10, nullptr, tskIDLE_PRIORITY + 1UL); manager.createTask(master_thread, "master",
configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL,
nullptr);
// Start the real time kernel with preemption. // Start the real time kernel with preemption.
//FreeRTOS::Kernel::startScheduler(); //FreeRTOS::Kernel::startScheduler();
vTaskStartScheduler (); vTaskStartScheduler ();

View File

@ -4,9 +4,16 @@
* Created on: 13 Apr 2023 * Created on: 13 Apr 2023
* Author: tylen * Author: tylen
*/ */
#ifndef __THREAD_COMMON_H_
#define __THREAD_COMMON_H_
#include "board.h" #include "board.h"
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include <string>
#include "queue.h" #include "queue.h"
#include "task.h"
#include <assert.h>
namespace ThreadCommon namespace ThreadCommon
{ {
@ -41,12 +48,25 @@ namespace ThreadCommon
uint8_t _data; uint8_t _data;
}; };
class ThreadManager
{
public:
ThreadManager();
~ThreadManager() = default;
bool createTask(void (*task_func)(void*),
std::string name,
size_t stack_size,
size_t priority,
void* parameters);
private:
};
/* global variables */ /* global variables */
/* 'receiver'_'what'_'sender'_q */ /* 'receiver'_'what'_'sender'_q */
extern QueueHandle_t master_event_all_q; extern QueueHandle_t master_event_all_q;
extern QueueHandle_t relay_event_master_q; extern QueueHandle_t relay_event_master_q;
extern QueueHandle_t manager_event_master_q; extern QueueHandle_t manager_event_master_q;
extern QueueHandle_t ui_event_manager_q; extern QueueHandle_t ui_event_manager_q;
} }
#endif /*__THREAD_COMMON_H_*/

View File

@ -0,0 +1,21 @@
#include "ThreadCommon.h"
ThreadCommon::ThreadManager::ThreadManager(){}
bool ThreadCommon::ThreadManager::createTask(void (*task_func)(void*),
std::string name,
size_t stack_size,
size_t priority,
void* parameters)
{
const char * t_name = name.c_str();
BaseType_t taskCreated = xTaskCreate(task_func,
t_name,
stack_size,
parameters,
priority,
NULL);
assert(taskCreated == pdPASS);
return (taskCreated == pdPASS);
}

View File

@ -7,15 +7,8 @@
#include "Master.h" #include "Master.h"
Master::Master(std::string name, size_t stack_size, void* pvParams, size_t task_priority)
: name(name), stack_size(stack_size), pvParams(pvParams), task_priority(task_priority)
{
xTaskCreate (Master::taskWrapper, "Master_thread", this->stack_size, this->pvParams, this->task_priority, this->master_task_handle);
}
Master::~Master(){}
void Master::taskFunction() { void Master::taskFunction() {
int led = 0;
bool LedState = true; bool LedState = true;
for (;;) { for (;;) {
Board_LED_Set(led, LedState); Board_LED_Set(led, LedState);
@ -27,3 +20,9 @@ void Master::taskFunction() {
vTaskDelay(1000); vTaskDelay(1000);
} }
} }
void master_thread(void* pvParams) {
Master m;
m.taskFunction();
}

View File

@ -16,26 +16,17 @@
class Master { class Master {
public: public:
Master(std::string name, size_t stack_size, void* pvParams, size_t task_priority); Master(){};
virtual ~Master(); virtual ~Master() = default;
void taskFunction(); void taskFunction();
static void taskWrapper(void *pvParams) {
Master* pSelf = reinterpret_cast<Master*>(pvParams);
pSelf->taskFunction();
}
//Master(Master&&) noexcept = default; //Master(Master&&) noexcept = default;
//Master& operator=(Master&&) noexcept = default; //Master& operator=(Master&&) noexcept = default;
private: private:
int led; ThreadCommon::Event* message;
std::string name;
size_t stack_size;
void* pvParams;
size_t task_priority;
TaskHandle_t* master_task_handle;
//std::shared_ptr<ThreadCommon::Event> message;
}; };
void master_thread(void* pvParams);
#endif /* THREADS_MASTER_MASTER_H_ */ #endif /* THREADS_MASTER_MASTER_H_ */