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

Dependencies:   FreeRTOS_V8_2_1 mbed

Committer:
uhclem
Date:
Fri Apr 22 18:48:57 2016 +0000
Revision:
0:34537a2d87bb
Not working! led1 stays lit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uhclem 0:34537a2d87bb 1 #include "mbed.h"
uhclem 0:34537a2d87bb 2 /* Scheduler includes. */
uhclem 0:34537a2d87bb 3 #include "FreeRTOS.h"
uhclem 0:34537a2d87bb 4 #include "task.h"
uhclem 0:34537a2d87bb 5 #include "queue.h"
uhclem 0:34537a2d87bb 6 #include "semphr.h"
uhclem 0:34537a2d87bb 7 #include "croutine.h"
uhclem 0:34537a2d87bb 8
uhclem 0:34537a2d87bb 9 uint64_t u64Ticks=0; // Counts OS ticks (default = 1000Hz).
uhclem 0:34537a2d87bb 10 uint64_t u64IdleTicks=0; // Value of u64IdleTicksCnt is copied once per sec.
uhclem 0:34537a2d87bb 11 uint64_t u64IdleTicksCnt=0; // Counts when the OS has no task to execute.
uhclem 0:34537a2d87bb 12 #define LED_NUM 3 /* Number of user LEDs */
uhclem 0:34537a2d87bb 13
uhclem 0:34537a2d87bb 14 volatile uint32_t msTicks; /* counts 1ms timeTicks */
uhclem 0:34537a2d87bb 15
uhclem 0:34537a2d87bb 16 #define mainTask1_LED_Priority ( tskIDLE_PRIORITY + 1 )
uhclem 0:34537a2d87bb 17 #define mainTask2_LED_Priority ( tskIDLE_PRIORITY + 2 )
uhclem 0:34537a2d87bb 18 #define mainTask3_LED_Priority ( tskIDLE_PRIORITY + 3 )
uhclem 0:34537a2d87bb 19
uhclem 0:34537a2d87bb 20 static void toggleLED1Task( void *pvParameters );
uhclem 0:34537a2d87bb 21 static void toggleLED2Task( void *pvParameters );
uhclem 0:34537a2d87bb 22 static void toggleLED3Task( void *pvParameters );
uhclem 0:34537a2d87bb 23
uhclem 0:34537a2d87bb 24 xSemaphoreHandle xSemaphore;
uhclem 0:34537a2d87bb 25
uhclem 0:34537a2d87bb 26 DigitalOut myled1(PB_3);
uhclem 0:34537a2d87bb 27 DigitalOut myled2(PB_4);
uhclem 0:34537a2d87bb 28 DigitalOut myled3(PA_8);
uhclem 0:34537a2d87bb 29
uhclem 0:34537a2d87bb 30
uhclem 0:34537a2d87bb 31
uhclem 0:34537a2d87bb 32 /*----------------------------------------------------------------------------
uhclem 0:34537a2d87bb 33 MAIN function
uhclem 0:34537a2d87bb 34 *----------------------------------------------------------------------------*/
uhclem 0:34537a2d87bb 35 int main (void) {
uhclem 0:34537a2d87bb 36
uhclem 0:34537a2d87bb 37 xTaskCreate( toggleLED1Task , "T1_LED", configMINIMAL_STACK_SIZE, NULL, mainTask1_LED_Priority, NULL );
uhclem 0:34537a2d87bb 38 xTaskCreate( toggleLED2Task , "T2_LED", configMINIMAL_STACK_SIZE, NULL, mainTask2_LED_Priority, NULL );
uhclem 0:34537a2d87bb 39 xTaskCreate( toggleLED3Task , "T3_LED", configMINIMAL_STACK_SIZE, NULL, mainTask3_LED_Priority, NULL );
uhclem 0:34537a2d87bb 40 myled1 = 0;
uhclem 0:34537a2d87bb 41 myled2 = 0;
uhclem 0:34537a2d87bb 42 myled3 = 0;
uhclem 0:34537a2d87bb 43 wait(1);
uhclem 0:34537a2d87bb 44
uhclem 0:34537a2d87bb 45 vSemaphoreCreateBinary( xSemaphore );
uhclem 0:34537a2d87bb 46
uhclem 0:34537a2d87bb 47 /* Start the scheduler. */
uhclem 0:34537a2d87bb 48 vTaskStartScheduler();
uhclem 0:34537a2d87bb 49
uhclem 0:34537a2d87bb 50 /* Will only get here if there was not enough heap space to create the
uhclem 0:34537a2d87bb 51 idle task. */
uhclem 0:34537a2d87bb 52
uhclem 0:34537a2d87bb 53 while(1) {
uhclem 0:34537a2d87bb 54 myled1 = 0;
uhclem 0:34537a2d87bb 55 wait(0.2);
uhclem 0:34537a2d87bb 56 myled1 = 1;
uhclem 0:34537a2d87bb 57 }
uhclem 0:34537a2d87bb 58
uhclem 0:34537a2d87bb 59 return 0;
uhclem 0:34537a2d87bb 60 }
uhclem 0:34537a2d87bb 61
uhclem 0:34537a2d87bb 62 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 63 static void toggleLED1Task( void *pvParameters )
uhclem 0:34537a2d87bb 64 {
uhclem 0:34537a2d87bb 65 int i=0;
uhclem 0:34537a2d87bb 66 for( ;; )
uhclem 0:34537a2d87bb 67 {
uhclem 0:34537a2d87bb 68 for(i=0; i<4; i++)
uhclem 0:34537a2d87bb 69 {
uhclem 0:34537a2d87bb 70 myled1 = 1;
uhclem 0:34537a2d87bb 71 wait(1);
uhclem 0:34537a2d87bb 72 myled1 = 0;
uhclem 0:34537a2d87bb 73 wait(1);
uhclem 0:34537a2d87bb 74 }
uhclem 0:34537a2d87bb 75 if( xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE )
uhclem 0:34537a2d87bb 76 {
uhclem 0:34537a2d87bb 77 for(i=0; i<10; i++)
uhclem 0:34537a2d87bb 78 {
uhclem 0:34537a2d87bb 79 myled1 = 1;
uhclem 0:34537a2d87bb 80 wait(0.3);
uhclem 0:34537a2d87bb 81 myled1 = 0;
uhclem 0:34537a2d87bb 82 wait(0.3);
uhclem 0:34537a2d87bb 83 }
uhclem 0:34537a2d87bb 84 xSemaphoreGive(xSemaphore);
uhclem 0:34537a2d87bb 85 }
uhclem 0:34537a2d87bb 86 }
uhclem 0:34537a2d87bb 87 }
uhclem 0:34537a2d87bb 88 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 89 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 90 static void toggleLED2Task( void *pvParameters )
uhclem 0:34537a2d87bb 91 {
uhclem 0:34537a2d87bb 92 int i=0;
uhclem 0:34537a2d87bb 93 for( ;; )
uhclem 0:34537a2d87bb 94 {
uhclem 0:34537a2d87bb 95 vTaskDelay(18000);
uhclem 0:34537a2d87bb 96 for(i=0; i<4; i++) {
uhclem 0:34537a2d87bb 97 myled2 = 1;
uhclem 0:34537a2d87bb 98 wait(0.2);
uhclem 0:34537a2d87bb 99 myled2 = 0;
uhclem 0:34537a2d87bb 100 wait(0.2);
uhclem 0:34537a2d87bb 101 }
uhclem 0:34537a2d87bb 102 }
uhclem 0:34537a2d87bb 103 }
uhclem 0:34537a2d87bb 104 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 105 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 106 static void toggleLED3Task( void *pvParameters )
uhclem 0:34537a2d87bb 107 {
uhclem 0:34537a2d87bb 108 int i=0;
uhclem 0:34537a2d87bb 109 for( ;; ) {
uhclem 0:34537a2d87bb 110 vTaskDelay(9500);
uhclem 0:34537a2d87bb 111 for(i=0; i<4; i++) {
uhclem 0:34537a2d87bb 112 myled3 = 1;
uhclem 0:34537a2d87bb 113 wait(1);
uhclem 0:34537a2d87bb 114 myled3 = 0;
uhclem 0:34537a2d87bb 115 wait(1);
uhclem 0:34537a2d87bb 116 }
uhclem 0:34537a2d87bb 117 if( xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE ) {
uhclem 0:34537a2d87bb 118 for(i=0; i<10; i++) {
uhclem 0:34537a2d87bb 119 myled3 = 1;
uhclem 0:34537a2d87bb 120 wait(0.3);
uhclem 0:34537a2d87bb 121 myled3 = 0;
uhclem 0:34537a2d87bb 122 wait(0.3);
uhclem 0:34537a2d87bb 123 }
uhclem 0:34537a2d87bb 124 xSemaphoreGive(xSemaphore);
uhclem 0:34537a2d87bb 125 }
uhclem 0:34537a2d87bb 126 }
uhclem 0:34537a2d87bb 127 }
uhclem 0:34537a2d87bb 128 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 129
uhclem 0:34537a2d87bb 130 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 131 // This FreeRTOS callback function gets called once per tick (default = 1000Hz).
uhclem 0:34537a2d87bb 132 // ----------------------------------------------------------------------------
uhclem 0:34537a2d87bb 133 void vApplicationTickHook( void ) {
uhclem 0:34537a2d87bb 134 ++u64Ticks;
uhclem 0:34537a2d87bb 135 }
uhclem 0:34537a2d87bb 136
uhclem 0:34537a2d87bb 137 // This FreeRTOS call-back function gets when no other task is ready to execute.
uhclem 0:34537a2d87bb 138 // On a completely unloaded system this is getting called at over 2.5MHz!
uhclem 0:34537a2d87bb 139 // ----------------------------------------------------------------------------
uhclem 0:34537a2d87bb 140 void vApplicationIdleHook( void ) {
uhclem 0:34537a2d87bb 141 ++u64IdleTicksCnt;
uhclem 0:34537a2d87bb 142 }
uhclem 0:34537a2d87bb 143
uhclem 0:34537a2d87bb 144 // A required FreeRTOS function.
uhclem 0:34537a2d87bb 145 // ----------------------------------------------------------------------------
uhclem 0:34537a2d87bb 146 void vApplicationMallocFailedHook( void ) {
uhclem 0:34537a2d87bb 147 configASSERT( 0 ); // Latch on any failure / error.
uhclem 0:34537a2d87bb 148 }
uhclem 0:34537a2d87bb 149
uhclem 0:34537a2d87bb 150 /*-----------------------------------------------------------*/
uhclem 0:34537a2d87bb 151 // This FreeRTOS callback function gets called once per tick (default = 1000Hz).
uhclem 0:34537a2d87bb 152 // ----------------------------------------------------------------------------
uhclem 0:34537a2d87bb 153 void vApplicationStackOverflowHook( void ) {
uhclem 0:34537a2d87bb 154 myled1 = 1;
uhclem 0:34537a2d87bb 155 wait(0.5);
uhclem 0:34537a2d87bb 156 myled1 = 0;
uhclem 0:34537a2d87bb 157 wait(0.5);
uhclem 0:34537a2d87bb 158 }