Simple test program to get familiar with functionality of MBED RTOS on ST Nucleo-F411RE. Tasks for LED blinking, user button, temperature measurement with DS1620, temperature measurement with internal temperature sensor of ST32F411RE, ultrasonic distance measurement and displaying result on 16x2 TextLCD.

Dependencies:   DS1620_improved TextLCD_improved mbed-rtos mbed

tsk_main.cpp

Committer:
Jan Tetour
Date:
2015-12-18
Revision:
18:be0130c42925
Parent:
17:94c385ff2641

File content as of revision 18:be0130c42925:

/*
 * TSK_MAIN.CPP
 */
#include "mbed.h"
#include "rtos.h"

#include "tsk_button.h"
#include "tsk_display.h"
#include "tsk_dist.h"
#include "tsk_led.h"
#include "tsk_temp.h"
#include "tsk_inttemp.h"

#define TASKS_NUMBER    (sizeof(taskList)/sizeof(taskList[0]))

uint32_t uiCnt = 0;
Mutex mutexDist;
Mutex mutexTemp;
Mutex mutexIntTemp;

struct task_definition_struct {
    void(*task)(void const *args);
    uint32_t(*init)(void const *args); // Result: 1 = OK, 0 = FAIL
    void *task_args;                   // NULL For DEFAULT (NULL)
    void *init_args;                   // NULL For DEFAULT (NULL)
    osPriority priority;
//    uint32_t stack_size;               // 0 for DEFAULT (DEFAULT_STACK_SIZE)
//    unsigned char *stack_pointer;      // NULL for DEFAULT (NULL)
    uint32_t delay;                    // Delay on start from previous task
    Thread *thread;                    // To be filled in during runtime
    uint32_t retVal;                   // Return Value - to be filled in during runtime
};

static struct task_definition_struct taskList[] = {
//    { dist_thread,    &initDist,       NULL, NULL, osPriorityNormal, 100, NULL, 0 },
    { temp_thread,    &initDS1620Temp, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
    { inttemp_thread, &initIntTemp,    NULL, NULL, osPriorityNormal, 100, NULL, 0 },
//    { button_thread,  NULL,            NULL, NULL, osPriorityNormal, 0, NULL, 0 },
    { led_thread,     &initLed,        NULL, NULL, osPriorityNormal, 100, NULL, 0 },
    { disp_thread,    &initDisplay,    NULL, NULL, osPriorityNormal, 100, NULL, 0 },
};

static uint32_t initTasks(void) {
    uint32_t i;
    uint32_t retval = 1;
    
    for (i = 0; i < TASKS_NUMBER; i++) {
        if (taskList[i].init != NULL) {
            if ((taskList[i].retVal = ((*taskList[i].init)(taskList[i].init_args))) == 0)
                retval = 0;
        } else {
            taskList[i].retVal = 1;
        }
    }
            
    for (i = 0; i < TASKS_NUMBER; i++) {
        Thread::wait(taskList[i].delay);

        if (taskList[i].retVal == 1) {
            taskList[i].thread = new Thread(taskList[i].task, taskList[i].task_args, taskList[i].priority );
        }
    }
    
    return retval;
}


int main() {
    
    initTasks();

    Thread::wait(osWaitForever);

    disposeDisplay(NULL);
}