Cooperative Multitasking Design Using State Machines

click_here

Joined Sep 22, 2020
548
The code from here...
The easiest way to do this is to use 3 switch statements - Each switch handles a different LED

This is a great way for a beginner to implement multitasking for simple control programs :)

I've made a skeleton program that you can build on - Fair warning though, I've just typed this out on my phone, check for bugs!

Code:
#include <stdbool.h>
#include <stdio.h>

enum ledState
{
    LED_ON,
    LED_OFF     
};

enum ledList
{
    LED1,
    LED2,
    LED3
};
 
// Updated in interrupt;
volatile bool Tick;
 
// TODO - ISR 10mS that switches "Tick" to true

// Turns LED outputs on/off   
void updateOutput(enum ledList ledNumber, enum ledState state)
{
    // TODO - Hardware specific code for outputs
}

int main(void)
{
    // One tick = 10mS
    const unsigned int led1OnTicks = 20;
    const unsigned int led1OffTicks = 25;
   
    const unsigned int led2OnTicks = 40;
    const unsigned int led2OffTicks = 50;
   
    const unsigned int led3OnTicks = 60;
    const unsigned int led3OffTicks = 75;
   
    enum ledState led1 = LED_OFF, led2 = LED_OFF, led3 = LED_OFF;
   
    int led1Ticks = led1OffTicks, led2Ticks = led2OffTicks, led3Ticks = led1OffTicks;
   
    while(1)
    {
        // blocking can be changed to more LED states if needed
        while(Tick == false)
        {
            continue;
        }
       
        Tick = false;
       
        switch(led1)
        {
            case LED_OFF:
           
                if(led1Ticks-- == 0)
                {
                    led1Ticks = led1OnTicks;
                    led1 = LED_ON;
           
                    updateOutput(LED1, LED_ON);
                }
                break;
           
            case LED_ON:
             
                if(led1Ticks-- == 0)
                {
                    led1Ticks = led1OffTicks;
                    led1 = LED_OFF;
           
                    updateOutput(LED1, LED_OFF);
                }
                break;
        }
       
        switch(led2)
        {
            case LED_OFF:
           
                if(led2Ticks-- == 0)
                {
                    led2Ticks = led2OnTicks;
                    led2 = LED_ON;
           
                    updateOutput(LED2, LED_ON);
                }
                break;
           
            case LED_ON:
             
                if(led2Ticks-- == 0)
                {
                    led2Ticks = led2OffTicks;
                    led2 = LED_OFF;
           
                    updateOutput(LED2, LED_OFF);
                }
                break;
        }
       
        switch(led3)
        {
            case LED_OFF:
           
                if(led3Ticks-- == 0)
                {
                    led3Ticks = led3OnTicks;
                    led3 = LED_ON;
           
                    updateOutput(LED3, LED_ON);
                }
                break;
           
            case LED_ON:
             
                if(led3Ticks-- == 0)
                {
                    led3Ticks = led3OffTicks;
                    led3 = LED_OFF;
           
                    updateOutput(LED3, LED_OFF);
                }
           
                break;
        }
    }
}
Code:
#include <stdbool.h>
#include <stdio.h>

enum ledState
{
    LED_ON,
    LED_OFF     
};

enum ledList
{
    LED1,
    LED2,
    LED3
};
 
// Updated in interrupt;
volatile bool Tick;
 
// TODO - ISR 10mS that switches "Tick" to true

// Turns LED outputs on/off   
void updateOutput(enum ledList ledNumber, enum ledState state)
{
    // TODO - Hardware specific code for outputs
}

int main(void)
{
    // One tick = 10mS
    const unsigned int led1OnTicks = 20;
    const unsigned int led1OffTicks = 25;
   
    const unsigned int led2OnTicks = 40;
    const unsigned int led2OffTicks = 50;
   
    const unsigned int led3OnTicks = 60;
    const unsigned int led3OffTicks = 75;
   
    enum ledState led1 = LED_OFF, led2 = LED_OFF, led3 = LED_OFF;
   
    int led1Ticks = led1OffTicks, led2Ticks = led2OffTicks, led3Ticks = led1OffTicks;
   
    while(1)
    {
        // blocking can be changed to more LED states if needed
        while(Tick == false)
        {
            continue;
        }
       
        Tick = false;
       
        switch(led1)
        {
            case LED_OFF:
           
                if(led1Ticks-- == 0)
                {
                    led1Ticks = led1OnTicks;
                    led1 = LED_ON;
           
                    updateOutput(LED1, LED_ON);
                }
                break;
           
            case LED_ON:
             
                if(led1Ticks-- == 0)
                {
                    led1Ticks = led1OffTicks;
                    led1 = LED_OFF;
           
                    updateOutput(LED1, LED_OFF);
                }
                break;
        }
       
        switch(led2)
        {
            case LED_OFF:
           
                if(led2Ticks-- == 0)
                {
                    led2Ticks = led2OnTicks;
                    led2 = LED_ON;
           
                    updateOutput(LED2, LED_ON);
                }
                break;
           
            case LED_ON:
             
                if(led2Ticks-- == 0)
                {
                    led2Ticks = led2OffTicks;
                    led2 = LED_OFF;
           
                    updateOutput(LED2, LED_OFF);
                }
                break;
        }
       
        switch(led3)
        {
            case LED_OFF:
           
                if(led3Ticks-- == 0)
                {
                    led3Ticks = led3OnTicks;
                    led3 = LED_ON;
           
                    updateOutput(LED3, LED_ON);
                }
                break;
           
            case LED_ON:
             
                if(led3Ticks-- == 0)
                {
                    led3Ticks = led3OffTicks;
                    led3 = LED_OFF;
           
                    updateOutput(LED3, LED_OFF);
                }
           
                break;
        }
    }
}
 
Top