University of Plymouth - Stages 1, 2 and 3 / Mbed OS Task329Solution
Committer:
noutram
Date:
Wed Sep 18 10:28:12 2019 +0000
Revision:
4:e1c35030b91a
Parent:
3:e5c2bfd464f7
Child:
5:70f6171496af
2019

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