not working!!! A test of semaphore passing from Alexander Dean's FreeRTOS workshop 2016
Dependencies: FreeRTOS_V8_2_1 mbed
main.cpp@0:34537a2d87bb, 2016-04-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |