University of Plymouth - Stages 1, 2 and 3 / Mbed OS Task329Solution
Revision:
0:9d6d139b1591
Child:
1:6c11c89de66c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Oct 20 12:03:06 2017 +0000
@@ -0,0 +1,88 @@
+#include "mbed.h"
+
+#define N 1000000
+#define RELEASED 0
+#define PRESSED  1
+
+DigitalOut red_led(PE_15);     //CountUp is in its critical section
+DigitalOut yellow_led(PB_10);  //CountDown is in its critical section
+DigitalOut green_led(PB_11);   //counter != 0
+DigitalIn button(USER_BUTTON);
+
+//Shared mutable state
+volatile long long counter = 0; //Volatile means it must be stored in memory
+
+//Increment the shared variable 
+void countUp()
+{
+    //RED MEANS THE COUNT UP FUNCTION IS IN ITS CRITICAL SECTION
+    red_led = 1;
+    for (unsigned int n=0; n<N; n++) {
+        counter++; 
+        counter++;
+        counter++;
+        counter++;
+        counter++;
+        counter++;
+        counter++;
+        counter++;
+        counter++;
+        counter++;           
+    }  
+    red_led = 0; 
+    
+    //Last to finish turnes out the green light
+    if (counter == 0) {
+        green_led = 0;   
+    }
+}
+
+//Decrement the shared variable
+void countDown()
+{
+    //YELLOW MEANS THE COUNT DOWN FUNCTION IS IN ITS CRITICAL SECTION
+    yellow_led = 1;
+    for (unsigned int n=0; n<N; n++) {
+        counter--;
+        counter--;
+        counter--;
+        counter--;
+        counter--;
+        counter--;
+        counter--;
+        counter--;
+        counter--;
+        counter--;           
+    }
+    yellow_led = 0;
+      
+    //Last to finish turns out the green light  
+    if (counter == 0) {
+        green_led = 0;   
+    }     
+}
+int main() {
+    
+    green_led = 1;
+    Timeout t1;
+    
+    // TRY EACH OF THESE LINES IN TURN.
+    // ALL IT DOES IS CHANGE THE TIMING OF THE ISR, NOT THE FUNCTION
+    
+    if (button == PRESSED) {
+        //VERSION 2: short delay allowing main to be preempted - you might want to tweak this value
+        t1.attach_us(callback(&countDown), 100);
+    } else {
+        //VERSION 1: 2s - ENOUGH TIME FOR COUNTUP TO FINISH
+        t1.attach(&countDown, 2);                   
+    }
+    
+    //Run count up on the main thread
+    countUp();
+    
+    //Now spin-lock for ever
+    while(1) { 
+        asm("nop");
+    };
+}
+