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