Nicholas Outram
/
Task328
Lab version
main.cpp
- Committer:
- noutram
- Date:
- 2017-07-13
- Revision:
- 1:ccec17874183
- Parent:
- 0:c6ec99d3da16
File content as of revision 1:ccec17874183:
#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"); }; }