Threaded LED blinker

Threaded LED blinker

To follow-up on my last experimentation with Windows on Galileo, I implemented a simple threaded blinker. In the short, 2 threads are created in the setup function. One if switching ON the LED, the other is switching it OFF. Both threads are using a critical section while operating the LED. The loop function simply activates and de-activates the blinker. All looks good and is very promising in terms of systems programming. It will be interesting – and probably easy – to implement a multi-threaded data collector. This is really promising.

#include

#include “stdafx.h”

#include “arduino.h”

#include “process.h”

#include “windows.h”

#define LONG_PAUSE_IN_MS 2000

#define SHORT_PAUSE_IN_MS 5

#define LED_OFF \

    digitalWrite(led, LOW);

#define LED_ON \

    digitalWrite(led, HIGH);

HANDLE h_on_thread = NULL;

HANDLE h_off_thread = NULL;

DWORD on_thread_id = 0;

DWORD off_thread_id = 0;

CRITICAL_SECTION cs;

int f_stop = 0;

int led = 13;  // This is the pin the LED is attached to.

unsigned int __stdcall on_thread(void );

unsigned int __stdcall off_thread(void *);

int _tmain(int argc, _TCHAR argv[]) {

    return RunArduinoSketch();

    // DeleteCriticalSection (need to do)

}

void setup() {

    pinMode(led, OUTPUT);

    InitializeCriticalSection(&cs);

    h_on_thread = (HANDLE)_beginthreadex(

        NULL,

        0,

        on_thread,

        (void *)NULL,

        0,

        (unsigned int *)&on_thread_id

    );

    assert(h_on_thread != NULL);

    h_off_thread = (HANDLE)_beginthreadex(

        NULL,

        0,

        off_thread,

        (void *)NULL,

        0,

        (unsigned int *)&off_thread_id

    );

    assert(h_off_thread != NULL);

}

void loop() {

    f_stop = 0;

    Sleep(LONG_PAUSE_IN_MS);

    f_stop = 1;

    Sleep(LONG_PAUSE_IN_MS);

}

unsigned int __stdcall on_thread(void *px) {

    for(;;) {

        while(f_stop == 0) {

            EnterCriticalSection(&cs);

            LED_ON;

            delay(SHORT_PAUSE_IN_MS);

            LeaveCriticalSection(&cs);

        }

    }

    return(0);

}

unsigned int __stdcall off_thread(void *px) {

    for(;;) {

        while(f_stop == 0) {

            EnterCriticalSection(&cs);

            LED_OFF;

            delay(SHORT_PAUSE_IN_MS);

            LeaveCriticalSection(&cs);

        }

    }

    return(0);

}