not working!!! A test of semaphore passing from Alexander Dean's FreeRTOS workshop 2016

Dependencies:   FreeRTOS_V8_2_1 mbed

main.cpp

Committer:
uhclem
Date:
2016-04-22
Revision:
0:34537a2d87bb

File content as of revision 0:34537a2d87bb:

#include "mbed.h"
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "croutine.h"

uint64_t u64Ticks=0;        // Counts OS ticks (default = 1000Hz).
uint64_t u64IdleTicks=0;    // Value of u64IdleTicksCnt is copied once per sec.
uint64_t u64IdleTicksCnt=0; // Counts when the OS has no task to execute.
#define LED_NUM     3                   /* Number of user LEDs                */

volatile uint32_t msTicks;                            /* counts 1ms timeTicks */

#define mainTask1_LED_Priority ( tskIDLE_PRIORITY + 1 )
#define mainTask2_LED_Priority ( tskIDLE_PRIORITY + 2 )
#define mainTask3_LED_Priority ( tskIDLE_PRIORITY + 3 )

static void toggleLED1Task( void *pvParameters );
static void toggleLED2Task( void *pvParameters );
static void toggleLED3Task( void *pvParameters );

xSemaphoreHandle xSemaphore;

DigitalOut myled1(PB_3);
DigitalOut myled2(PB_4);
DigitalOut myled3(PA_8);



/*----------------------------------------------------------------------------
  MAIN function
 *----------------------------------------------------------------------------*/
int main (void) {
    
    xTaskCreate( toggleLED1Task , "T1_LED", configMINIMAL_STACK_SIZE, NULL, mainTask1_LED_Priority, NULL );
    xTaskCreate( toggleLED2Task , "T2_LED", configMINIMAL_STACK_SIZE, NULL, mainTask2_LED_Priority, NULL );
    xTaskCreate( toggleLED3Task , "T3_LED", configMINIMAL_STACK_SIZE, NULL, mainTask3_LED_Priority, NULL );
    myled1 = 0;
    myled2 = 0;
    myled3 = 0;
    wait(1);
    
    vSemaphoreCreateBinary( xSemaphore );
    
    /* Start the scheduler. */
    vTaskStartScheduler();  

    /* Will only get here if there was not enough heap space to create the
    idle task. */
    
    while(1) {
        myled1 = 0;
        wait(0.2);
        myled1 = 1;
    }
    
    return 0;    
}

/*-----------------------------------------------------------*/
static void toggleLED1Task( void *pvParameters )
{
    int i=0;
    for( ;; )
    {   
        for(i=0; i<4; i++)
        {
            myled1 = 1;
            wait(1);
            myled1 = 0;
            wait(1);
        }
        if( xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE )
        {
                    for(i=0; i<10; i++)
                    {
                        myled1 = 1;
                        wait(0.3);
                        myled1 = 0;
                        wait(0.3);
                    }
                    xSemaphoreGive(xSemaphore);
                }
    }
}
/*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
static void toggleLED2Task( void *pvParameters )
{
    int i=0;
    for( ;; )
    {
        vTaskDelay(18000);
        for(i=0; i<4; i++) {
            myled2 = 1;
            wait(0.2);
            myled2 = 0;
            wait(0.2);
        }
    }
}
/*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
static void toggleLED3Task( void *pvParameters )
{
    int i=0;
    for( ;; ) {
        vTaskDelay(9500);
        for(i=0; i<4; i++) {
            myled3 = 1;
            wait(1);
            myled3 = 0;
            wait(1);
        }
        if( xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE ) {
            for(i=0; i<10; i++) {
                myled3 = 1;
                wait(0.3);
                myled3 = 0;
                wait(0.3);
            }
            xSemaphoreGive(xSemaphore);
        }
    }
}
/*-----------------------------------------------------------*/

/*-----------------------------------------------------------*/
// This FreeRTOS callback function gets called once per tick (default = 1000Hz).
// ---------------------------------------------------------------------------- 
void vApplicationTickHook( void ) {
    ++u64Ticks;
}

// This FreeRTOS call-back function gets when no other task is ready to execute.
// On a completely unloaded system this is getting called at over 2.5MHz!
// ---------------------------------------------------------------------------- 
void vApplicationIdleHook( void ) {
    ++u64IdleTicksCnt;
}

// A required FreeRTOS function.
// ---------------------------------------------------------------------------- 
void vApplicationMallocFailedHook( void ) {
    configASSERT( 0 );  // Latch on any failure / error.
}

/*-----------------------------------------------------------*/
// This FreeRTOS callback function gets called once per tick (default = 1000Hz).
// ---------------------------------------------------------------------------- 
void vApplicationStackOverflowHook( void ) {
    myled1 = 1;
    wait(0.5);
    myled1 = 0;
    wait(0.5);
}