Simple Task Scheduler. For the moment only implements continuous running tasks and periodic tasks.
Example
two blinking leds
#include "mbed.h" #include "task_scheduler.h" Serial pc(USBTX, USBRX); // tx, r class Foo { DigitalOut myled1; int counter; public: Foo(void) :myled1(LED1) { counter = 0; } void alive_task(void) { if (counter++ % 30000 == 0) { myled1 = !myled1; } } }; class Bar { DigitalOut myled2; public: Bar(void) :myled2(LED2) {} void control_task(void) { myled2 = !myled2; } }; int main() { Foo foo; Bar bar; SimpleTaskScheduler::TaskScheduler scheduler; scheduler.create_continuous_task(&foo, &Foo::alive_task); scheduler.create_periodic_task(&bar, &Bar::control_task, 1); while(1) { scheduler.update(); } }
Diff: task_scheduler.h
- Revision:
- 3:bd96023168df
- Parent:
- 2:1d20f2b3c788
--- a/task_scheduler.h Wed Jul 13 09:01:16 2016 +0000 +++ b/task_scheduler.h Tue Dec 13 14:48:48 2016 +0100 @@ -1,7 +1,7 @@ #pragma once #include <vector> -#include "task.h" +#include "continuous_task.h" #include "periodic_task.h" // Definition of template methods need to be inside header file. @@ -20,20 +20,22 @@ public: void update(void); + void stop_task(unsigned int id); + void start_task(unsigned int id); public: - template<typename T> int create_continuous_task(T* object, void (T::*method)(void)) { - Task * task = new Task(object, method); + template<typename T> unsigned int create_continuous_task(T* object, void (T::*method)(void)) { + Task * task = new ContinuousTask(object, method); return add_task(task); } - template<typename T> int create_periodic_task(T* object, void (T::*method)(void), float period_seconds) { + template<typename T> unsigned int create_periodic_task(T* object, void (T::*method)(void), float period_seconds) { Task * task = new PeriodicTask(object, method, period_seconds); return add_task(task); } private: - int add_task(Task * task); + unsigned int add_task(Task * task); }; };