/* * task.h * * Created on: Oct 29, 2021 * Author: compi */ #ifndef FSL_TASK_H_ #define FSL_TASK_H_ #include #include // FreeRTOS #include // FreeRTOS namespace fsl { template class Task { public: Task(UBaseType_t priority, void (T::*fp)()) : m_priority(priority), m_fp(fp) {} void Start(SemaphoreHandle_t doneSem = nullptr, bool waitForInit = false) { m_handle = xTaskCreateStatic(staticBridge, getName(), sizeof(m_stack)/sizeof(m_stack[0]), this, m_priority, m_stack, &m_tcb); } virtual ~Task() {}; virtual char const * getName() = 0; private: static void staticBridge(void *taskObj) { reinterpret_cast*>(taskObj)->taskBridge(); } void taskBridge() { (static_cast(this)->*m_fp)(); } TaskHandle_t m_handle; UBaseType_t m_priority; void (T::*m_fp)(); StaticTask_t m_tcb; StackType_t m_stack[stackSize]; }; } /* namespace fsl */ #endif /* FSL_TASK_H_ */