>>106324073
so this is the task itself, the first one is just a wrapper to generalize all tasks and provide the manual dispatch for "virtuals" (task_entry, task_init)
class task_c
{
using task_fn_t = void(void *);
task_wrapper_c task_wrapper_;
TickType_t period_time_;
static void task_callback(void* args)
{
auto& self = *static_cast<task_c*>(args);
task_init(self.task_wrapper_);
for(;;)
{
task_entry(self.task_wrapper_);
vTaskDelay(self.period_time_);
}
}
public:
task_c(const char *const name,
uint16_t stack_depth,
UBaseType_t priority,
TickType_t deadline,
task_wrapper_c &&object)
: task_name_{name}
, stack_depth_{stack_depth}
, priority_{priority}
, task_handle_{nullptr}
, object_{object, deadline}
{}
void spawn()
{
// How to handle tasks that are not delay-triggered?
// We can release tasks using timers, semaphores, mutex, messages, and event group flags....
xTaskCreate(
task_c::task_callback,
this->task_name_,
this->stack_depth_,
this,
this->priority_,
&this->task_handle_);
}
void kill_task()
{
vTaskDelete(this->task_handle_);
}
TickType_t get_deadline() const
{
return this->object_.period_time_;
}
private:
char const *const task_name_{nullptr};
entry_args_t object_; // No default constructor
uint16_t stack_depth_{};
UBaseType_t priority_{};
TaskHandle_t task_handle_{nullptr};
task_fn_t *task_entry_{nullptr};
};