Nicholas Outram
/
Task328
Lab version
Diff: main.cpp
- Revision:
- 0:c6ec99d3da16
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Mar 09 12:47:53 2016 +0000 @@ -0,0 +1,86 @@ +#include "mbed.h" +#define N 100000 +#define RELEASED 1 +#define PRESSED 0 +DigitalOut red_led(D7); //CountUp is in its critical section +DigitalOut yellow_led(D6); //CountDown is in its critical section +DigitalOut green_led(D5); //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 (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 (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(&countDown, 15); + } 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"); + }; +} +