University of Plymouth - Stages 1, 2 and 3 / Mbed OS Task329Solution
Committer:
noutram
Date:
Fri Oct 20 13:53:00 2017 +0000
Revision:
1:6c11c89de66c
Parent:
0:9d6d139b1591
Child:
2:5d467e30afbd
ISR synchronisation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
noutram 0:9d6d139b1591 1 #include "mbed.h"
noutram 0:9d6d139b1591 2
noutram 0:9d6d139b1591 3 #define N 1000000
noutram 0:9d6d139b1591 4 #define RELEASED 0
noutram 0:9d6d139b1591 5 #define PRESSED 1
noutram 0:9d6d139b1591 6
noutram 0:9d6d139b1591 7 DigitalOut red_led(PE_15); //CountUp is in its critical section
noutram 0:9d6d139b1591 8 DigitalOut yellow_led(PB_10); //CountDown is in its critical section
noutram 0:9d6d139b1591 9 DigitalOut green_led(PB_11); //counter != 0
noutram 0:9d6d139b1591 10 DigitalIn button(USER_BUTTON);
noutram 0:9d6d139b1591 11
noutram 0:9d6d139b1591 12 //Shared mutable state
noutram 0:9d6d139b1591 13 volatile long long counter = 0; //Volatile means it must be stored in memory
noutram 0:9d6d139b1591 14
noutram 0:9d6d139b1591 15 //Increment the shared variable
noutram 0:9d6d139b1591 16 void countUp()
noutram 0:9d6d139b1591 17 {
noutram 0:9d6d139b1591 18 //RED MEANS THE COUNT UP FUNCTION IS IN ITS CRITICAL SECTION
noutram 0:9d6d139b1591 19 red_led = 1;
noutram 0:9d6d139b1591 20 for (unsigned int n=0; n<N; n++) {
noutram 1:6c11c89de66c 21 __disable_irq();
noutram 0:9d6d139b1591 22 counter++;
noutram 0:9d6d139b1591 23 counter++;
noutram 0:9d6d139b1591 24 counter++;
noutram 0:9d6d139b1591 25 counter++;
noutram 0:9d6d139b1591 26 counter++;
noutram 0:9d6d139b1591 27 counter++;
noutram 0:9d6d139b1591 28 counter++;
noutram 0:9d6d139b1591 29 counter++;
noutram 0:9d6d139b1591 30 counter++;
noutram 1:6c11c89de66c 31 counter++;
noutram 1:6c11c89de66c 32 __enable_irq();
noutram 0:9d6d139b1591 33 }
noutram 0:9d6d139b1591 34 red_led = 0;
noutram 0:9d6d139b1591 35
noutram 0:9d6d139b1591 36 //Last to finish turnes out the green light
noutram 0:9d6d139b1591 37 if (counter == 0) {
noutram 0:9d6d139b1591 38 green_led = 0;
noutram 0:9d6d139b1591 39 }
noutram 0:9d6d139b1591 40 }
noutram 0:9d6d139b1591 41
noutram 0:9d6d139b1591 42 //Decrement the shared variable
noutram 0:9d6d139b1591 43 void countDown()
noutram 0:9d6d139b1591 44 {
noutram 0:9d6d139b1591 45 //YELLOW MEANS THE COUNT DOWN FUNCTION IS IN ITS CRITICAL SECTION
noutram 0:9d6d139b1591 46 yellow_led = 1;
noutram 0:9d6d139b1591 47 for (unsigned int n=0; n<N; n++) {
noutram 1:6c11c89de66c 48 __disable_irq();
noutram 0:9d6d139b1591 49 counter--;
noutram 0:9d6d139b1591 50 counter--;
noutram 0:9d6d139b1591 51 counter--;
noutram 0:9d6d139b1591 52 counter--;
noutram 0:9d6d139b1591 53 counter--;
noutram 0:9d6d139b1591 54 counter--;
noutram 0:9d6d139b1591 55 counter--;
noutram 0:9d6d139b1591 56 counter--;
noutram 0:9d6d139b1591 57 counter--;
noutram 1:6c11c89de66c 58 counter--;
noutram 1:6c11c89de66c 59 __enable_irq();
noutram 0:9d6d139b1591 60 }
noutram 0:9d6d139b1591 61 yellow_led = 0;
noutram 0:9d6d139b1591 62
noutram 0:9d6d139b1591 63 //Last to finish turns out the green light
noutram 0:9d6d139b1591 64 if (counter == 0) {
noutram 0:9d6d139b1591 65 green_led = 0;
noutram 0:9d6d139b1591 66 }
noutram 0:9d6d139b1591 67 }
noutram 0:9d6d139b1591 68 int main() {
noutram 0:9d6d139b1591 69
noutram 0:9d6d139b1591 70 green_led = 1;
noutram 0:9d6d139b1591 71 Timeout t1;
noutram 0:9d6d139b1591 72
noutram 0:9d6d139b1591 73 // TRY EACH OF THESE LINES IN TURN.
noutram 0:9d6d139b1591 74 // ALL IT DOES IS CHANGE THE TIMING OF THE ISR, NOT THE FUNCTION
noutram 0:9d6d139b1591 75
noutram 0:9d6d139b1591 76 if (button == PRESSED) {
noutram 0:9d6d139b1591 77 //VERSION 2: short delay allowing main to be preempted - you might want to tweak this value
noutram 0:9d6d139b1591 78 t1.attach_us(callback(&countDown), 100);
noutram 0:9d6d139b1591 79 } else {
noutram 0:9d6d139b1591 80 //VERSION 1: 2s - ENOUGH TIME FOR COUNTUP TO FINISH
noutram 0:9d6d139b1591 81 t1.attach(&countDown, 2);
noutram 0:9d6d139b1591 82 }
noutram 0:9d6d139b1591 83
noutram 0:9d6d139b1591 84 //Run count up on the main thread
noutram 0:9d6d139b1591 85 countUp();
noutram 0:9d6d139b1591 86
noutram 0:9d6d139b1591 87 //Now spin-lock for ever
noutram 0:9d6d139b1591 88 while(1) {
noutram 0:9d6d139b1591 89 asm("nop");
noutram 0:9d6d139b1591 90 };
noutram 0:9d6d139b1591 91 }
noutram 0:9d6d139b1591 92