![](/media/cache/profiles/acab0116c354964a558e65bdd07ff047.jpg.50x50_q85.jpg)
Comparing a wait with yield vs a polling-busy-wait
Fork of Task621-mbedos54 by
Diff: main.cpp
- Revision:
- 0:f916cefba2f4
- Child:
- 1:4fb27aea76b2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 08 11:43:39 2016 +0000 @@ -0,0 +1,106 @@ +#include "mbed.h" +#include "rtos.h" + +#define RED_DONE 1 +#define YELLOW_DONE 2 + + +//Function declarations +void countUP(void const *args); +void countDOWN(void const *args); + +//Digital outputs +DigitalOut onBoardLED(LED1); +DigitalOut redLED(D7); +DigitalOut yellowLED(D6); +DigitalOut greenLED(D5); + +//Digital inputs +DigitalIn onBoardSwitch(USER_BUTTON); +DigitalIn SW1(D4); +DigitalIn SW2(D3); + +//Thread object references +Thread* t1; +Thread* t2; + +//Thread ID for the Main function (CMSIS API) +osThreadId tidMain; + +//Stared mutable state +volatile long long count = 0; + +//Threads +void countUP(void const *args) +{ + redLED = 1; + + for (unsigned int n=0; n<10000; n++) { + count++; + count++; + count++; + count++; + count++; + count++; + count++; + count++; + count++; + count++; + } + + redLED = 0; + osSignalSet(tidMain, RED_DONE); //Signal main thread we are done +} + +void countDOWN(void const *args) +{ + yellowLED = 1; + + for (unsigned int n=0; n<10000; n++) { + count--; + count--; + count--; + count--; + count--; + count--; + count--; + count--; + count--; + count--; + } + + osSignalSet(tidMain, YELLOW_DONE); //Signal main thread we are done + yellowLED = 0; +} + + +//Main thread +int main() { + redLED = 0; + yellowLED = 0; + greenLED = 1; + + //Main thread ID + tidMain = Thread::gettid(); + + //Press the switch to run concurrently + if (onBoardSwitch == 1) { + printf("Running sequntially\n"); + countUP(NULL); + countDOWN(NULL); + } else { + printf("Running concurrently\n"); + Thread t1(countUP); + Thread t2(countDOWN); + + //Wait for the ALL_ON signal + Thread::signal_wait(RED_DONE,osWaitForever); + Thread::signal_wait(YELLOW_DONE,osWaitForever); + } + + printf("Final result = %lld\n", count); + if (count == 0) { + greenLED = 0; + } + while(true); +}