Phillip Stevens
Published © GPL3+

Using FreeRTOS multi-tasking in Arduino

FreeRTOS, simple, easy to use, robust, optimised for Arduino IDE. Full access to FreeRTOS capabilities, within classic Arduino environment.

IntermediateProtip1 hour123,947
Using FreeRTOS multi-tasking in Arduino

Things used in this project

Hardware components

Arduino UNO & Genuino UNO
Arduino UNO & Genuino UNO
×1
Arduino Yun
Arduino Yun
×1
Arduino Leonardo
Arduino Leonardo
×1
Arduino Micro & Genuino Micro
Arduino Micro & Genuino Micro
×1
Arduino Mega 2560 & Genuino Mega 2560
Arduino Mega 2560 & Genuino Mega 2560
×1
Seeeduino Lite
×1
Seeeduino Stalker V3
×1
Seeeduino Ethernet
×1
Pro Micro - 5V/16MHz
SparkFun Pro Micro - 5V/16MHz
×1
SparkFun RedStick
SparkFun RedStick
×1
SparkFun MicroView - OLED Arduino Module
SparkFun MicroView - OLED Arduino Module
×1
FreeRTOS
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Code

Blink_AnalogRead.ino

Arduino
These are two basic sketches from the Arduino IDE Built-in Examples, combined into one multi-tasking sketch using two FreeRTOS Tasks.
#include <Arduino_FreeRTOS.h>

// define two tasks for Blink & AnalogRead
void TaskBlink( void *pvParameters );
void TaskAnalogRead( void *pvParameters );

// the setup function runs once when you press reset or power the board
void setup() {

  // Now set up two tasks to run independently.
  xTaskCreate(
    TaskBlink
    ,  (const portCHAR *)"Blink"   // A name just for humans
    ,  128  // Stack size
    ,  NULL
    ,  2  // priority
    ,  NULL );

  xTaskCreate(
    TaskAnalogRead
    ,  (const portCHAR *) "AnalogRead"
    ,  128 // This stack size can be checked & adjusted by reading Highwater
    ,  NULL
    ,  1  // priority
    ,  NULL );

  // Now the task scheduler, which takes over control of scheduling individual tasks, is automatically started.
}

void loop()
{
  // Empty. Things are done in Tasks.
}

/*--------------------------------------------------*/
/*---------------------- Tasks ---------------------*/
/*--------------------------------------------------*/

void TaskBlink(void *pvParameters)  // This is a task.
{
  (void) pvParameters;

  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);

  for (;;) // A Task shall never return or exit.
  {
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second
  }
}

void TaskAnalogRead(void *pvParameters)  // This is a task.
{
  (void) pvParameters;

  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

  for (;;)
  {
    // read the input on analog pin 0:
    int sensorValue = analogRead(A0);
    // print out the value you read:
    Serial.println(sensorValue);
    vTaskDelay(1);  // one tick delay (15ms) in between reads for stability
  }
}

Credits

Phillip Stevens

Phillip Stevens

16 projects • 63 followers
You can flog a dead horse to water, but the grass is always greener on the flip side.
Thanks to Richard Berry.

Comments

Add projectSign up / Login