Oliver Ainhirn
/
82_Thread_Semaphore
Semaphore_Display
main.cpp@0:ac644277eadb, 2019-03-21 (annotated)
- Committer:
- corsa1600
- Date:
- Thu Mar 21 16:53:36 2019 +0000
- Revision:
- 0:ac644277eadb
- Child:
- 1:98ffcc251be8
LCD-Anzeige
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
corsa1600 | 0:ac644277eadb | 1 | // see: [[RTOS: Demonstration Setup]] |
corsa1600 | 0:ac644277eadb | 2 | // Trace ab 15:00 |
corsa1600 | 0:ac644277eadb | 3 | |
corsa1600 | 0:ac644277eadb | 4 | #include "mbed.h" |
corsa1600 | 0:ac644277eadb | 5 | #include "C12832.h" |
corsa1600 | 0:ac644277eadb | 6 | |
corsa1600 | 0:ac644277eadb | 7 | C12832 lcd (p5, p7, p6, p8, p11); |
corsa1600 | 0:ac644277eadb | 8 | |
corsa1600 | 0:ac644277eadb | 9 | class Rgb |
corsa1600 | 0:ac644277eadb | 10 | { |
corsa1600 | 0:ac644277eadb | 11 | private: |
corsa1600 | 0:ac644277eadb | 12 | DigitalOut _led; |
corsa1600 | 0:ac644277eadb | 13 | |
corsa1600 | 0:ac644277eadb | 14 | public: |
corsa1600 | 0:ac644277eadb | 15 | Rgb(PinName ld) : _led(ld) { _led = 1;}; // Constructor |
corsa1600 | 0:ac644277eadb | 16 | |
corsa1600 | 0:ac644277eadb | 17 | void LedOn() { |
corsa1600 | 0:ac644277eadb | 18 | _led = 0; |
corsa1600 | 0:ac644277eadb | 19 | } |
corsa1600 | 0:ac644277eadb | 20 | void LedOff(){ |
corsa1600 | 0:ac644277eadb | 21 | _led.write(1); |
corsa1600 | 0:ac644277eadb | 22 | } |
corsa1600 | 0:ac644277eadb | 23 | }; |
corsa1600 | 0:ac644277eadb | 24 | |
corsa1600 | 0:ac644277eadb | 25 | class HasA |
corsa1600 | 0:ac644277eadb | 26 | { |
corsa1600 | 0:ac644277eadb | 27 | private: |
corsa1600 | 0:ac644277eadb | 28 | DigitalOut _led; |
corsa1600 | 0:ac644277eadb | 29 | |
corsa1600 | 0:ac644277eadb | 30 | public: |
corsa1600 | 0:ac644277eadb | 31 | HasA(PinName ld) : _led(ld) {}; // Constructor |
corsa1600 | 0:ac644277eadb | 32 | |
corsa1600 | 0:ac644277eadb | 33 | void LedOn() { |
corsa1600 | 0:ac644277eadb | 34 | _led = 1; |
corsa1600 | 0:ac644277eadb | 35 | } |
corsa1600 | 0:ac644277eadb | 36 | void LedOff(){ |
corsa1600 | 0:ac644277eadb | 37 | _led.write(0); |
corsa1600 | 0:ac644277eadb | 38 | } |
corsa1600 | 0:ac644277eadb | 39 | }; |
corsa1600 | 0:ac644277eadb | 40 | |
corsa1600 | 0:ac644277eadb | 41 | void Delay_Nonsense(uint32_t * DelayCounter, uint32_t const * TargetCount) |
corsa1600 | 0:ac644277eadb | 42 | { |
corsa1600 | 0:ac644277eadb | 43 | while(*DelayCounter <= *TargetCount) |
corsa1600 | 0:ac644277eadb | 44 | { |
corsa1600 | 0:ac644277eadb | 45 | *DelayCounter = *DelayCounter + 1; |
corsa1600 | 0:ac644277eadb | 46 | } |
corsa1600 | 0:ac644277eadb | 47 | |
corsa1600 | 0:ac644277eadb | 48 | *DelayCounter = 0; |
corsa1600 | 0:ac644277eadb | 49 | } |
corsa1600 | 0:ac644277eadb | 50 | |
corsa1600 | 0:ac644277eadb | 51 | //M3 r (p23); g (p24); b (p25); |
corsa1600 | 0:ac644277eadb | 52 | /* |
corsa1600 | 0:ac644277eadb | 53 | HasA Led1(LED1); |
corsa1600 | 0:ac644277eadb | 54 | HasA Led2(LED2); |
corsa1600 | 0:ac644277eadb | 55 | HasA Led3(LED3); |
corsa1600 | 0:ac644277eadb | 56 | */ |
corsa1600 | 0:ac644277eadb | 57 | Rgb Led1(p23); |
corsa1600 | 0:ac644277eadb | 58 | Rgb Led2(p24); |
corsa1600 | 0:ac644277eadb | 59 | Rgb Led3(p25); |
corsa1600 | 0:ac644277eadb | 60 | |
corsa1600 | 0:ac644277eadb | 61 | //void Led1_Blink(void *pvParameters) |
corsa1600 | 0:ac644277eadb | 62 | void Led1_Blink() // red long |
corsa1600 | 0:ac644277eadb | 63 | { |
corsa1600 | 0:ac644277eadb | 64 | const int xDelay = 500; |
corsa1600 | 0:ac644277eadb | 65 | uint32_t BlueDelay = 0; |
corsa1600 | 0:ac644277eadb | 66 | const uint32_t TargetCount = 16000; |
corsa1600 | 0:ac644277eadb | 67 | |
corsa1600 | 0:ac644277eadb | 68 | for(;;) { |
corsa1600 | 0:ac644277eadb | 69 | for(int i = 0; i < 10; i++) { // randomnes |
corsa1600 | 0:ac644277eadb | 70 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 71 | } |
corsa1600 | 0:ac644277eadb | 72 | |
corsa1600 | 0:ac644277eadb | 73 | { |
corsa1600 | 0:ac644277eadb | 74 | lcd.cls(); |
corsa1600 | 0:ac644277eadb | 75 | lcd.locate(0,3); |
corsa1600 | 0:ac644277eadb | 76 | lcd.printf("Thread 1 RED LED blinks \r\nxxxxxxxx!"); |
corsa1600 | 0:ac644277eadb | 77 | |
corsa1600 | 0:ac644277eadb | 78 | Led1.LedOn(); |
corsa1600 | 0:ac644277eadb | 79 | Delay_Nonsense(&BlueDelay, &TargetCount); |
corsa1600 | 0:ac644277eadb | 80 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 81 | Led1.LedOff(); |
corsa1600 | 0:ac644277eadb | 82 | Delay_Nonsense(&BlueDelay, &TargetCount); |
corsa1600 | 0:ac644277eadb | 83 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 84 | } |
corsa1600 | 0:ac644277eadb | 85 | } |
corsa1600 | 0:ac644277eadb | 86 | } |
corsa1600 | 0:ac644277eadb | 87 | |
corsa1600 | 0:ac644277eadb | 88 | void Led2_Blink() // green |
corsa1600 | 0:ac644277eadb | 89 | { |
corsa1600 | 0:ac644277eadb | 90 | const int xDelay = 250; |
corsa1600 | 0:ac644277eadb | 91 | uint32_t BlueDelay = 0; |
corsa1600 | 0:ac644277eadb | 92 | const uint32_t TargetCount = 16000; |
corsa1600 | 0:ac644277eadb | 93 | |
corsa1600 | 0:ac644277eadb | 94 | for(;;) { |
corsa1600 | 0:ac644277eadb | 95 | for(int i = 0; i < 10; i++) { // randomnes |
corsa1600 | 0:ac644277eadb | 96 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 97 | } |
corsa1600 | 0:ac644277eadb | 98 | { |
corsa1600 | 0:ac644277eadb | 99 | lcd.cls(); |
corsa1600 | 0:ac644277eadb | 100 | lcd.locate(0,3); |
corsa1600 | 0:ac644277eadb | 101 | lcd.printf("Thread 2 GREEN LED blinks \r\nxxxxxxxx!"); |
corsa1600 | 0:ac644277eadb | 102 | |
corsa1600 | 0:ac644277eadb | 103 | Led2.LedOn(); |
corsa1600 | 0:ac644277eadb | 104 | Delay_Nonsense(&BlueDelay, &TargetCount); |
corsa1600 | 0:ac644277eadb | 105 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 106 | Led2.LedOff(); |
corsa1600 | 0:ac644277eadb | 107 | Delay_Nonsense(&BlueDelay, &TargetCount); |
corsa1600 | 0:ac644277eadb | 108 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 109 | } |
corsa1600 | 0:ac644277eadb | 110 | } |
corsa1600 | 0:ac644277eadb | 111 | } |
corsa1600 | 0:ac644277eadb | 112 | |
corsa1600 | 0:ac644277eadb | 113 | void Led3_Blink() // blue very short |
corsa1600 | 0:ac644277eadb | 114 | { |
corsa1600 | 0:ac644277eadb | 115 | const int xDelay = 100; |
corsa1600 | 0:ac644277eadb | 116 | uint32_t BlueDelay = 0; |
corsa1600 | 0:ac644277eadb | 117 | const uint32_t TargetCount = 16000; |
corsa1600 | 0:ac644277eadb | 118 | |
corsa1600 | 0:ac644277eadb | 119 | for(;;) { |
corsa1600 | 0:ac644277eadb | 120 | for(int i = 0; i < 10; i++) { // randomnes |
corsa1600 | 0:ac644277eadb | 121 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 122 | } |
corsa1600 | 0:ac644277eadb | 123 | { |
corsa1600 | 0:ac644277eadb | 124 | lcd.cls(); |
corsa1600 | 0:ac644277eadb | 125 | lcd.locate(0,3); |
corsa1600 | 0:ac644277eadb | 126 | lcd.printf("Thread 3 BLUE LED blinks \r\nxxxxxxxx!"); |
corsa1600 | 0:ac644277eadb | 127 | |
corsa1600 | 0:ac644277eadb | 128 | |
corsa1600 | 0:ac644277eadb | 129 | Led3.LedOn(); |
corsa1600 | 0:ac644277eadb | 130 | Delay_Nonsense(&BlueDelay, &TargetCount); |
corsa1600 | 0:ac644277eadb | 131 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 132 | Led3.LedOff(); |
corsa1600 | 0:ac644277eadb | 133 | Delay_Nonsense(&BlueDelay, &TargetCount); |
corsa1600 | 0:ac644277eadb | 134 | wait_ms(xDelay); |
corsa1600 | 0:ac644277eadb | 135 | } |
corsa1600 | 0:ac644277eadb | 136 | } |
corsa1600 | 0:ac644277eadb | 137 | } |
corsa1600 | 0:ac644277eadb | 138 | |
corsa1600 | 0:ac644277eadb | 139 | DigitalOut Led4(LED4); |
corsa1600 | 0:ac644277eadb | 140 | volatile bool running = true; |
corsa1600 | 0:ac644277eadb | 141 | |
corsa1600 | 0:ac644277eadb | 142 | // Callback function to pass arguments to params |
corsa1600 | 0:ac644277eadb | 143 | void blink(DigitalOut *led) { |
corsa1600 | 0:ac644277eadb | 144 | osThreadSetPriority(osThreadGetId(), osPriorityIdle); |
corsa1600 | 0:ac644277eadb | 145 | while (running) { |
corsa1600 | 0:ac644277eadb | 146 | *led = !*led; |
corsa1600 | 0:ac644277eadb | 147 | wait(1); |
corsa1600 | 0:ac644277eadb | 148 | } |
corsa1600 | 0:ac644277eadb | 149 | } |
corsa1600 | 0:ac644277eadb | 150 | |
corsa1600 | 0:ac644277eadb | 151 | // https://docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/tasks/rtos/#thread |
corsa1600 | 0:ac644277eadb | 152 | |
corsa1600 | 0:ac644277eadb | 153 | Thread thread1;//(osPriorityNormal, 400, NULL); //DEFAULT_STACK_SIZE, NULL); die default stack size funktioniert manchmal nicht laut Hr. Pucher |
corsa1600 | 0:ac644277eadb | 154 | // Thread thread1; |
corsa1600 | 0:ac644277eadb | 155 | Thread thread2; |
corsa1600 | 0:ac644277eadb | 156 | Thread thread3; |
corsa1600 | 0:ac644277eadb | 157 | // parametrisierter Thread |
corsa1600 | 0:ac644277eadb | 158 | Thread pthread; //(osPriorityHigh, 400, NULL);//DEFAULT_STACK_SIZE, NULL); |
corsa1600 | 0:ac644277eadb | 159 | |
corsa1600 | 0:ac644277eadb | 160 | int main() { |
corsa1600 | 0:ac644277eadb | 161 | thread1.start(Led1_Blink); |
corsa1600 | 0:ac644277eadb | 162 | thread2.start(Led2_Blink); |
corsa1600 | 0:ac644277eadb | 163 | thread3.start(Led3_Blink); |
corsa1600 | 0:ac644277eadb | 164 | // Start parametrisierter Thread mit Callback Funktion |
corsa1600 | 0:ac644277eadb | 165 | pthread.start(callback(blink, &Led4)); |
corsa1600 | 0:ac644277eadb | 166 | |
corsa1600 | 0:ac644277eadb | 167 | osThreadSetPriority(osThreadGetId(), osPriorityIdle); // osPriorityHigh, |
corsa1600 | 0:ac644277eadb | 168 | // osPriorityIdle |
corsa1600 | 0:ac644277eadb | 169 | Thread::yield(); |
corsa1600 | 0:ac644277eadb | 170 | printf("Priority is %i\r\n", thread1.get_priority()); |
corsa1600 | 0:ac644277eadb | 171 | Thread::wait(1); |
corsa1600 | 0:ac644277eadb | 172 | |
corsa1600 | 0:ac644277eadb | 173 | thread1.join(); |
corsa1600 | 0:ac644277eadb | 174 | thread2.join(); |
corsa1600 | 0:ac644277eadb | 175 | thread3.join(); |
corsa1600 | 0:ac644277eadb | 176 | |
corsa1600 | 0:ac644277eadb | 177 | while(1) { |
corsa1600 | 0:ac644277eadb | 178 | } |
corsa1600 | 0:ac644277eadb | 179 | thread1.terminate(); |
corsa1600 | 0:ac644277eadb | 180 | } |
corsa1600 | 0:ac644277eadb | 181 | |
corsa1600 | 0:ac644277eadb | 182 |