Making fsl::Task even more elegant

This commit is contained in:
Attila Body 2021-11-09 11:59:34 +01:00
parent 0111f3d210
commit 5139921a22

View file

@ -17,20 +17,16 @@ namespace fsl {
template<typename T, uint32_t stackSize> 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]),
void Start() {
m_handle = xTaskCreateStatic(taskStaticBridge, 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<Task<T, stackSize>*>(taskObj)->taskBridge();
}
void taskBridge() {
(static_cast<T*>(this)->*m_fp)();
static void taskStaticBridge(void *_this) {
(static_cast<T*>(reinterpret_cast<Task<T, stackSize>*>(_this))->*(reinterpret_cast<Task<T, stackSize>*>(_this)->m_fp))();
}
TaskHandle_t m_handle;