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(); } }
task_scheduler.cpp@3:bd96023168df, 2016-12-13 (annotated)
- Committer:
- dwini
- Date:
- Tue Dec 13 14:48:48 2016 +0100
- Revision:
- 3:bd96023168df
- Parent:
- 0:ba0870ec8714
Refactor and allow starting and stopping of tasks.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dwini | 0:ba0870ec8714 | 1 | #include "task_scheduler.h" |
dwini | 0:ba0870ec8714 | 2 | |
dwini | 0:ba0870ec8714 | 3 | namespace SimpleTaskScheduler { |
dwini | 0:ba0870ec8714 | 4 | |
dwini | 0:ba0870ec8714 | 5 | TaskScheduler::TaskScheduler(void) { } |
dwini | 0:ba0870ec8714 | 6 | |
dwini | 0:ba0870ec8714 | 7 | TaskScheduler::~TaskScheduler(void) { |
dwini | 0:ba0870ec8714 | 8 | for (unsigned int i = 0; i < tasks.size(); i++) { |
dwini | 0:ba0870ec8714 | 9 | delete tasks[i]; |
dwini | 0:ba0870ec8714 | 10 | } |
dwini | 0:ba0870ec8714 | 11 | } |
dwini | 0:ba0870ec8714 | 12 | |
dwini | 0:ba0870ec8714 | 13 | void TaskScheduler::update(void) { |
dwini | 0:ba0870ec8714 | 14 | for (unsigned int i = 0; i < tasks.size(); i++) { |
dwini | 0:ba0870ec8714 | 15 | tasks[i]->run(); |
dwini | 0:ba0870ec8714 | 16 | } |
dwini | 0:ba0870ec8714 | 17 | } |
dwini | 0:ba0870ec8714 | 18 | |
dwini |
3:bd96023168df | 19 | void TaskScheduler::stop_task(unsigned int id) { |
dwini |
3:bd96023168df | 20 | for (unsigned int i = 0; i < tasks.size(); i++) { |
dwini |
3:bd96023168df | 21 | if (tasks[i]->get_id() == id) { |
dwini |
3:bd96023168df | 22 | tasks[i]->stop(); |
dwini |
3:bd96023168df | 23 | } |
dwini |
3:bd96023168df | 24 | } |
dwini |
3:bd96023168df | 25 | } |
dwini |
3:bd96023168df | 26 | |
dwini |
3:bd96023168df | 27 | void TaskScheduler::start_task(unsigned int id) { |
dwini |
3:bd96023168df | 28 | for (unsigned int i = 0; i < tasks.size(); i++) { |
dwini |
3:bd96023168df | 29 | if (tasks[i]->get_id() == id) { |
dwini |
3:bd96023168df | 30 | tasks[i]->start(); |
dwini |
3:bd96023168df | 31 | } |
dwini |
3:bd96023168df | 32 | } |
dwini |
3:bd96023168df | 33 | } |
dwini |
3:bd96023168df | 34 | |
dwini |
3:bd96023168df | 35 | unsigned int TaskScheduler::add_task(Task * task) { |
dwini | 0:ba0870ec8714 | 36 | tasks.push_back(task); |
dwini | 0:ba0870ec8714 | 37 | return task->get_id(); |
dwini | 0:ba0870ec8714 | 38 | } |
dwini | 0:ba0870ec8714 | 39 | }; |