More elegant fsl::Task implementation
This commit is contained in:
parent
7eedbfdf9b
commit
0111f3d210
9 changed files with 301 additions and 19 deletions
|
@ -16,17 +16,26 @@ namespace fsl {
|
|||
|
||||
template<typename T, uint32_t stackSize> class Task {
|
||||
public:
|
||||
Task(UBaseType_t priority) : m_priority(priority) {}
|
||||
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(T::TaskFn, getName(), sizeof(m_stack)/sizeof(m_stack[0]),
|
||||
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<Task<T, stackSize>*>(taskObj)->taskBridge();
|
||||
}
|
||||
|
||||
void taskBridge() {
|
||||
(static_cast<T*>(this)->*m_fp)();
|
||||
}
|
||||
|
||||
TaskHandle_t m_handle;
|
||||
UBaseType_t m_priority;
|
||||
void (T::*m_fp)();
|
||||
StaticTask_t m_tcb;
|
||||
StackType_t m_stack[stackSize];
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue