RGB Thread with synchrinization, such as mutex, semaphore and signal.
siehe auch RTOS-Threads Application Board
main.cpp@1:db53d0623808, 2017-03-28 (annotated)
- Committer:
- fpucher
- Date:
- Tue Mar 28 17:04:53 2017 +0000
- Revision:
- 1:db53d0623808
- Parent:
- 0:15d27adc65b3
Names changed to RGB and some comments added
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fpucher | 1:db53d0623808 | 1 | // see: [[RTOS: Demonstration Setup]] |
fpucher | 0:15d27adc65b3 | 2 | // Trace ab 15:00 |
fpucher | 1:db53d0623808 | 3 | // -->>>>> Löschen Sie die Kommentare bei den entsprechenden Synchronisationsmöglichkeiten (LedMutex, LedSemaphore, Signal) |
fpucher | 1:db53d0623808 | 4 | // bzw. geben Sie die Kommentare wieder hinein wenn Sie andere testen wollen |
fpucher | 0:15d27adc65b3 | 5 | |
fpucher | 0:15d27adc65b3 | 6 | #include "mbed.h" |
fpucher | 0:15d27adc65b3 | 7 | |
fpucher | 0:15d27adc65b3 | 8 | class Rgb |
fpucher | 0:15d27adc65b3 | 9 | { |
fpucher | 0:15d27adc65b3 | 10 | private: |
fpucher | 0:15d27adc65b3 | 11 | DigitalOut _led; |
fpucher | 1:db53d0623808 | 12 | |
fpucher | 0:15d27adc65b3 | 13 | public: |
fpucher | 1:db53d0623808 | 14 | Rgb(PinName ld) : _led(ld) { |
fpucher | 1:db53d0623808 | 15 | _led = 1; |
fpucher | 1:db53d0623808 | 16 | }; // Constructor with RgbLed = off |
fpucher | 1:db53d0623808 | 17 | |
fpucher | 0:15d27adc65b3 | 18 | void LedOn() { |
fpucher | 0:15d27adc65b3 | 19 | _led = 0; |
fpucher | 0:15d27adc65b3 | 20 | } |
fpucher | 1:db53d0623808 | 21 | void LedOff() { |
fpucher | 0:15d27adc65b3 | 22 | _led.write(1); |
fpucher | 0:15d27adc65b3 | 23 | } |
fpucher | 1:db53d0623808 | 24 | }; |
fpucher | 0:15d27adc65b3 | 25 | |
fpucher | 0:15d27adc65b3 | 26 | class HasA |
fpucher | 0:15d27adc65b3 | 27 | { |
fpucher | 0:15d27adc65b3 | 28 | private: |
fpucher | 0:15d27adc65b3 | 29 | DigitalOut _led; |
fpucher | 1:db53d0623808 | 30 | |
fpucher | 0:15d27adc65b3 | 31 | public: |
fpucher | 0:15d27adc65b3 | 32 | HasA(PinName ld) : _led(ld) {}; // Constructor |
fpucher | 1:db53d0623808 | 33 | |
fpucher | 0:15d27adc65b3 | 34 | void LedOn() { |
fpucher | 0:15d27adc65b3 | 35 | _led = 1; |
fpucher | 0:15d27adc65b3 | 36 | } |
fpucher | 1:db53d0623808 | 37 | void LedOff() { |
fpucher | 0:15d27adc65b3 | 38 | _led.write(0); |
fpucher | 0:15d27adc65b3 | 39 | } |
fpucher | 1:db53d0623808 | 40 | }; |
fpucher | 0:15d27adc65b3 | 41 | |
fpucher | 0:15d27adc65b3 | 42 | void Delay_Nonsense(uint32_t * DelayCounter, uint32_t const * TargetCount) |
fpucher | 0:15d27adc65b3 | 43 | { |
fpucher | 1:db53d0623808 | 44 | while(*DelayCounter <= *TargetCount) { |
fpucher | 0:15d27adc65b3 | 45 | *DelayCounter = *DelayCounter + 1; |
fpucher | 0:15d27adc65b3 | 46 | } |
fpucher | 0:15d27adc65b3 | 47 | *DelayCounter = 0; |
fpucher | 0:15d27adc65b3 | 48 | } |
fpucher | 0:15d27adc65b3 | 49 | |
fpucher | 1:db53d0623808 | 50 | //M3: R(p23); G(p24); B(p25); |
fpucher | 1:db53d0623808 | 51 | |
fpucher | 0:15d27adc65b3 | 52 | HasA Led1(LED1); |
fpucher | 0:15d27adc65b3 | 53 | HasA Led2(LED2); |
fpucher | 0:15d27adc65b3 | 54 | HasA Led3(LED3); |
fpucher | 1:db53d0623808 | 55 | |
fpucher | 1:db53d0623808 | 56 | Rgb LedR(p23); |
fpucher | 1:db53d0623808 | 57 | Rgb LedG(p24); |
fpucher | 1:db53d0623808 | 58 | Rgb LedB(p25); |
fpucher | 0:15d27adc65b3 | 59 | |
fpucher | 0:15d27adc65b3 | 60 | Mutex LedMutex; |
fpucher | 1:db53d0623808 | 61 | Semaphore LedSemaphore(1); |
fpucher | 0:15d27adc65b3 | 62 | |
fpucher | 1:db53d0623808 | 63 | //void LedR_Blink(void *pvParameters) |
fpucher | 1:db53d0623808 | 64 | void LedR_Blink() // red |
fpucher | 0:15d27adc65b3 | 65 | { |
fpucher | 1:db53d0623808 | 66 | const int xDelay = 500; // Leuchtdauer |
fpucher | 1:db53d0623808 | 67 | uint32_t BlueDelay = 0; // zufällige Verzögerung von ... |
fpucher | 1:db53d0623808 | 68 | const uint32_t TargetCount = 16000; // ... bis |
fpucher | 0:15d27adc65b3 | 69 | |
fpucher | 1:db53d0623808 | 70 | for(;;) { |
fpucher | 0:15d27adc65b3 | 71 | // for(int i = 0; i < 10; i++) { // Zufälligkeit |
fpucher | 0:15d27adc65b3 | 72 | // wait_ms(xDelay); |
fpucher | 0:15d27adc65b3 | 73 | // } |
fpucher | 0:15d27adc65b3 | 74 | |
fpucher | 1:db53d0623808 | 75 | // Obtain the Mutex - block for 0 ticks if the semaphore is not |
fpucher | 1:db53d0623808 | 76 | // immediately available. |
fpucher | 0:15d27adc65b3 | 77 | // if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE ) |
fpucher | 1:db53d0623808 | 78 | //LedMutex.lock(); |
fpucher | 1:db53d0623808 | 79 | LedSemaphore.wait(); |
fpucher | 1:db53d0623808 | 80 | //Thread::signal_wait(0x1); |
fpucher | 1:db53d0623808 | 81 | { |
fpucher | 1:db53d0623808 | 82 | LedR.LedOn(); |
fpucher | 1:db53d0623808 | 83 | Delay_Nonsense(&BlueDelay, &TargetCount); |
fpucher | 1:db53d0623808 | 84 | wait_ms(xDelay); |
fpucher | 1:db53d0623808 | 85 | LedR.LedOff(); |
fpucher | 1:db53d0623808 | 86 | Delay_Nonsense(&BlueDelay, &TargetCount); |
fpucher | 1:db53d0623808 | 87 | wait_ms(xDelay); |
fpucher | 1:db53d0623808 | 88 | } |
fpucher | 0:15d27adc65b3 | 89 | // xSemaphoreGive(LEDMutex); |
fpucher | 1:db53d0623808 | 90 | //LedMutex.unlock(); |
fpucher | 1:db53d0623808 | 91 | LedSemaphore.release(); |
fpucher | 1:db53d0623808 | 92 | } |
fpucher | 0:15d27adc65b3 | 93 | } |
fpucher | 0:15d27adc65b3 | 94 | |
fpucher | 1:db53d0623808 | 95 | void LedG_Blink() // green |
fpucher | 0:15d27adc65b3 | 96 | { |
fpucher | 1:db53d0623808 | 97 | const int xDelay = 250; |
fpucher | 1:db53d0623808 | 98 | uint32_t BlueDelay = 0; |
fpucher | 1:db53d0623808 | 99 | const uint32_t TargetCount = 16000; |
fpucher | 0:15d27adc65b3 | 100 | |
fpucher | 1:db53d0623808 | 101 | for(;;) { |
fpucher | 0:15d27adc65b3 | 102 | // for(int i = 0; i < 10; i++) { |
fpucher | 0:15d27adc65b3 | 103 | // wait_ms(xDelay); |
fpucher | 0:15d27adc65b3 | 104 | // } |
fpucher | 0:15d27adc65b3 | 105 | |
fpucher | 1:db53d0623808 | 106 | // Obtain the Mutex - block for 0 ticks if the semaphore is not |
fpucher | 1:db53d0623808 | 107 | // immediately available. |
fpucher | 0:15d27adc65b3 | 108 | // if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE ) |
fpucher | 0:15d27adc65b3 | 109 | //LedMutex.lock(); |
fpucher | 1:db53d0623808 | 110 | LedSemaphore.wait(); |
fpucher | 0:15d27adc65b3 | 111 | //Thread::signal_wait(0x1); |
fpucher | 0:15d27adc65b3 | 112 | { |
fpucher | 1:db53d0623808 | 113 | LedG.LedOn(); |
fpucher | 1:db53d0623808 | 114 | Delay_Nonsense(&BlueDelay, &TargetCount); |
fpucher | 1:db53d0623808 | 115 | wait_ms(xDelay); |
fpucher | 1:db53d0623808 | 116 | LedG.LedOff(); |
fpucher | 1:db53d0623808 | 117 | Delay_Nonsense(&BlueDelay, &TargetCount); |
fpucher | 1:db53d0623808 | 118 | wait_ms(xDelay); |
fpucher | 0:15d27adc65b3 | 119 | // xSemaphoreGive(LEDMutex); |
fpucher | 1:db53d0623808 | 120 | } |
fpucher | 0:15d27adc65b3 | 121 | //LedMutex.unlock(); |
fpucher | 1:db53d0623808 | 122 | LedSemaphore.release(); |
fpucher | 0:15d27adc65b3 | 123 | |
fpucher | 0:15d27adc65b3 | 124 | |
fpucher | 1:db53d0623808 | 125 | } |
fpucher | 0:15d27adc65b3 | 126 | } |
fpucher | 0:15d27adc65b3 | 127 | |
fpucher | 1:db53d0623808 | 128 | void LedB_Blink() // blue |
fpucher | 0:15d27adc65b3 | 129 | { |
fpucher | 1:db53d0623808 | 130 | const int xDelay = 100; |
fpucher | 1:db53d0623808 | 131 | uint32_t BlueDelay = 0; |
fpucher | 1:db53d0623808 | 132 | const uint32_t TargetCount = 16000; |
fpucher | 0:15d27adc65b3 | 133 | |
fpucher | 1:db53d0623808 | 134 | for(;;) { |
fpucher | 0:15d27adc65b3 | 135 | // for(int i = 0; i < 10; i++) { // Zufälligkeit |
fpucher | 0:15d27adc65b3 | 136 | // wait_ms(xDelay); |
fpucher | 0:15d27adc65b3 | 137 | // } |
fpucher | 0:15d27adc65b3 | 138 | |
fpucher | 1:db53d0623808 | 139 | // Obtain the Mutex - block for 0 ticks if the semaphore is not |
fpucher | 1:db53d0623808 | 140 | // immediately available. |
fpucher | 0:15d27adc65b3 | 141 | // if( xSemaphoreTake( LEDMutex, ( TickType_t ) 10 ) == pdTRUE ) |
fpucher | 1:db53d0623808 | 142 | //LedMutex.lock(); // Led leuchten wird nicht mehr unterbrochen !!! |
fpucher | 1:db53d0623808 | 143 | LedSemaphore.wait(); |
fpucher | 1:db53d0623808 | 144 | //Thread::signal_wait(0x1); |
fpucher | 1:db53d0623808 | 145 | { |
fpucher | 1:db53d0623808 | 146 | LedB.LedOn(); |
fpucher | 1:db53d0623808 | 147 | Delay_Nonsense(&BlueDelay, &TargetCount); |
fpucher | 1:db53d0623808 | 148 | wait_ms(xDelay+100); |
fpucher | 1:db53d0623808 | 149 | LedB.LedOff(); |
fpucher | 1:db53d0623808 | 150 | Delay_Nonsense(&BlueDelay, &TargetCount); |
fpucher | 1:db53d0623808 | 151 | wait_ms(xDelay); |
fpucher | 0:15d27adc65b3 | 152 | // xSemaphoreGive(LEDMutex); |
fpucher | 1:db53d0623808 | 153 | } |
fpucher | 1:db53d0623808 | 154 | //LedMutex.unlock(); |
fpucher | 1:db53d0623808 | 155 | LedSemaphore.release(); |
fpucher | 1:db53d0623808 | 156 | //thread.signal_set(0x1); |
fpucher | 0:15d27adc65b3 | 157 | |
fpucher | 1:db53d0623808 | 158 | } |
fpucher | 0:15d27adc65b3 | 159 | } |
fpucher | 0:15d27adc65b3 | 160 | |
fpucher | 0:15d27adc65b3 | 161 | Thread thread1(osPriorityNormal, DEFAULT_STACK_SIZE, NULL); |
fpucher | 0:15d27adc65b3 | 162 | //Thread thread1; |
fpucher | 0:15d27adc65b3 | 163 | Thread thread2; |
fpucher | 0:15d27adc65b3 | 164 | Thread thread3; |
fpucher | 0:15d27adc65b3 | 165 | |
fpucher | 1:db53d0623808 | 166 | int main() |
fpucher | 1:db53d0623808 | 167 | { |
fpucher | 1:db53d0623808 | 168 | thread1.start(LedR_Blink); |
fpucher | 1:db53d0623808 | 169 | thread2.start(LedG_Blink); |
fpucher | 1:db53d0623808 | 170 | thread3.start(LedB_Blink); |
fpucher | 0:15d27adc65b3 | 171 | |
fpucher | 1:db53d0623808 | 172 | /* Signals |
fpucher | 1:db53d0623808 | 173 | wait(2); |
fpucher | 1:db53d0623808 | 174 | thread1.signal_set(0x1); |
fpucher | 1:db53d0623808 | 175 | wait(2); |
fpucher | 1:db53d0623808 | 176 | thread2.signal_set(0x1); |
fpucher | 1:db53d0623808 | 177 | wait(2); |
fpucher | 1:db53d0623808 | 178 | thread3.signal_set(0x1); |
fpucher | 1:db53d0623808 | 179 | */ |
fpucher | 0:15d27adc65b3 | 180 | thread1.join(); |
fpucher | 0:15d27adc65b3 | 181 | thread2.join(); |
fpucher | 0:15d27adc65b3 | 182 | thread3.join(); |
fpucher | 0:15d27adc65b3 | 183 | while(1) { |
fpucher | 1:db53d0623808 | 184 | Led1.LedOn(); |
fpucher | 1:db53d0623808 | 185 | wait(0.5); |
fpucher | 1:db53d0623808 | 186 | Led1.LedOff(); |
fpucher | 1:db53d0623808 | 187 | wait(0.5); |
fpucher | 0:15d27adc65b3 | 188 | } |
fpucher | 0:15d27adc65b3 | 189 | } |