Stage-1 Students SoCEM
/
Task632-mbedos54
Demonstration of a message queue + memory pool
Diff: main.cpp
- Revision:
- 9:31031bbb59c7
- Parent:
- 8:c5663f5fa848
- Child:
- 10:3a3d2a571c8f
--- a/main.cpp Mon Mar 14 19:48:24 2016 +0000 +++ b/main.cpp Mon Mar 21 13:50:11 2016 +0000 @@ -10,15 +10,15 @@ void thread2( const void* ); void switchISR(); +//Analogue inputs +AnalogIn adcIn(A0); + //Digital outputs DigitalOut onBoardLED(LED1); DigitalOut redLED(D7); DigitalOut yellowLED(D6); DigitalOut greenLED(D5); -//Serial Interface -Serial pc(USBTX, USBRX); - //Digital inputs DigitalIn onBoardSwitch(USER_BUTTON); DigitalIn sw1(D4); //CONSIDER CHANGING THIS TO AN INTERRUPT @@ -26,50 +26,60 @@ //Threads Thread *t1; -Thread *t2; -//Thread ID for the Main function (CMSIS API) -osThreadId tidMain; -osThreadId tid1; -osThreadId tid2; +//Queues - "A message can be a integer or pointer value to a certain type T that is sent to a thread or interrupt service routine." +Queue<uint32_t, 5> *queue; -//TBD: Call this on the falling edge of SW1 -void switchISR() { - //TBD +// Call this on precise intervals +void adcISR() { + + //Option to starve the queue + if (sw2 == 1) return; + + //Read sample - make a copy + uint32_t sample = (uint32_t)(4095*adcIn.read()); + + //Write to queue + osStatus stat = queue->put((uint32_t*)sample); + + //Check if succesful + if (stat == osErrorResource) { + redLED = 1; + printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat); + } + } -//High priority thread +//Normal priority thread (consumer) void thread1( const void* arg ) -{ - redLED = 1; +{ while (true) { - - // THIS IS BAD BAD BAD BAD BAD BAD - // BLOCK ON FALLING EDGE OF SW1 BY RAPID POLLING (SPINNING) - // Thread is blocked in the RUNNING state - while (sw1 == 0); - wait_ms(200); //Wait for debounce - while (sw1 == 1); - // TODO: FIX THIS! GET THE INTERRUPT TO SIGNAL THIS THREAD - - redLED = !redLED; - Thread::wait(1000); //Thread in WAITING state - redLED = !redLED; - Thread::wait(1000); //Thread in WAITING state - } -} - -// This thread has normal priority -// It is supposed to flash the green LED every second. -// THIS IS NOT WORKING because it is currently being starved by thread1 (while polling the switch) -void thread2( const void* arg ) -{ - greenLED = 1; - while (true) { - Thread::wait(500); - greenLED = !greenLED; - } + //Read queue - block (with timeout) + osEvent evt = queue->get(5000); //With timeout + + //Check status of get() + switch (evt.status) { + case osEventMessage: + //Normal status + printf("value = %d\n\r", evt.value.v); + greenLED = !greenLED; + break; + case osEventTimeout: + //Timeout + printf("queue->get() returned %02x status (timeout)\n\r", evt.status); + break; + default: + //All other errors (see cmsis_os.h for meaning of error code) + printf("queue->get() returned %02x status\n\r", evt.status); + break; + } + + //Block up consumer if switch is held down + //Will fill the queue if held long enough + while (sw1 == 1); + + } //end while } @@ -79,20 +89,23 @@ yellowLED = 0; greenLED = 0; + //Start message + printf("Welcome\n"); + + //Queue + queue = new Queue<uint32_t,5>(); + + //Hook up timer interrupt + Ticker timer; + timer.attach(&adcISR, 1.0); + //Threads - t1 = new Thread(&thread1, NULL, osPriorityRealtime); //HIGH PRIORITY - t2 = new Thread(&thread2, NULL, osPriorityNormal); - - // Thread IDs - tidMain = Thread::gettid(); - tid1 = t1->gettid(); - tid2 = t2->gettid(); + t1 = new Thread(&thread1); - //TBD: Hook up interrupt - - pc.printf("Main Thread\n"); + printf("Main Thread\n"); while (true) { - Thread::wait(osWaitForever); + Thread::wait(5000); + puts("Main Thread Alive"); } }