s_task, a new multitasking library that supports arduino

s_task is a coroutine mulitask library, with various platforms supported, such as windows, linux, android, macos, stm32, stm8, arduino, etc.

Example for arduino --

#include "src/s_task/s_task.h"

//This program demonstrates three tasks:
// 1) main_task - 
//    Wait 10 seconds and set flag g_exit. 
//    After all tasks finished, set LED on always.
// 2) sub_task_fast_blinking -
//    Set led blinking fast
// 3) sub_task_set_low -
//    Set led off for 1 second, and then blinking for 3 seconds.


void setup() {
    // put your setup code here, to run once:
    pinMode(LED_BUILTIN, OUTPUT);
}


char g_stack0[384];
char g_stack1[384];
volatile bool g_is_low = false;
volatile bool g_exit = false;

void sub_task_fast_blinking(__async__, void* arg) {
    while(!g_exit) {
        if(!g_is_low)
            digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)

        s_task_msleep(__await__, 50);                       // wait for a second
        //s_task_yield(__await__);
        digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
        s_task_msleep(__await__, 50);                       // wait for a second
        //s_task_yield(__await__);
    }    
}

void sub_task_set_low(__async__, void* arg) {
    while(!g_exit) {
        g_is_low = true;
        digitalWrite(LED_BUILTIN, LOW);
        s_task_sleep(__await__, 1);
        g_is_low = false;
        s_task_sleep(__await__, 3);
    }    
}

void main_task(__async__, void* arg) {
    int i;
    s_task_create(g_stack0, sizeof(g_stack0), sub_task_fast_blinking, NULL);
    s_task_create(g_stack1, sizeof(g_stack1), sub_task_set_low, NULL);

    for (i = 0; i < 10; ++i) {
        //s_task_yield(__await__);
        s_task_sleep(__await__, 1);
    }
    g_exit = true;

    s_task_join(__await__, g_stack0);
    s_task_join(__await__, g_stack1);
}

void loop() {
    __init_async__;
    
    s_task_init_system();
    main_task(__await__, NULL);

    digitalWrite(LED_BUILTIN, HIGH);
    while(1);
}