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();
    }
}

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?

UserRevisionLine numberNew 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 };