2019
Diff: main.cpp
- Revision:
- 0:c49a2dd99fc3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Sep 20 14:06:30 2019 +0000
@@ -0,0 +1,85 @@
+#include "mbed.h"
+void countUp();
+void countDown();
+
+#define N 1000000
+#define RELEASED 0
+#define PRESSED 1
+
+//Hardware
+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);
+
+//Additional Threads
+Thread t1;
+Thread t2;
+
+//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;
+
+}
+
+//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;
+
+}
+int main() {
+
+ green_led = 1;
+
+ //Start competing threads
+ t1.start(countUp);
+ t2.start(countDown);
+
+ //These threads DO exit, so let's wait for BOTH to finish
+ t1.join(); //Wait for thread t1 to finish
+ t2.join(); //Wait for thread t2 to finish
+
+ //Did the counter end up at zero?
+ if (counter == 0) {
+ green_led = 0;
+ }
+
+ //Now spin-lock for ever
+ while(1) {
+ asm("nop");
+ };
+}
+