Demonstrates a race condition

Committer:
noutram
Date:
Wed Sep 18 10:31:06 2019 +0000
Revision:
5:5dcfbaa2e549
Parent:
4:e1c35030b91a
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 5:5dcfbaa2e549 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 0:9d6d139b1591 32 counter++;
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 3:e5c2bfd464f7 41 counter++;
noutram 0:9d6d139b1591 42 }
noutram 0:9d6d139b1591 43 red_led = 0;
noutram 0:9d6d139b1591 44
noutram 0:9d6d139b1591 45 //Last to finish turnes out the green light
noutram 0:9d6d139b1591 46 if (counter == 0) {
noutram 0:9d6d139b1591 47 green_led = 0;
noutram 0:9d6d139b1591 48 }
noutram 0:9d6d139b1591 49 }
noutram 0:9d6d139b1591 50
noutram 0:9d6d139b1591 51 //Decrement the shared variable
noutram 0:9d6d139b1591 52 void countDown()
noutram 0:9d6d139b1591 53 {
noutram 0:9d6d139b1591 54 //YELLOW MEANS THE COUNT DOWN FUNCTION IS IN ITS CRITICAL SECTION
noutram 0:9d6d139b1591 55 yellow_led = 1;
noutram 0:9d6d139b1591 56 for (unsigned int n=0; n<N; n++) {
noutram 0:9d6d139b1591 57 counter--;
noutram 0:9d6d139b1591 58 counter--;
noutram 0:9d6d139b1591 59 counter--;
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 4:e1c35030b91a 66 counter--;
noutram 0:9d6d139b1591 67 }
noutram 0:9d6d139b1591 68 yellow_led = 0;
noutram 0:9d6d139b1591 69
noutram 0:9d6d139b1591 70 //Last to finish turns out the green light
noutram 0:9d6d139b1591 71 if (counter == 0) {
noutram 0:9d6d139b1591 72 green_led = 0;
noutram 0:9d6d139b1591 73 }
noutram 0:9d6d139b1591 74 }
noutram 0:9d6d139b1591 75 int main() {
noutram 0:9d6d139b1591 76
noutram 0:9d6d139b1591 77 green_led = 1;
noutram 0:9d6d139b1591 78 Timeout t1;
noutram 0:9d6d139b1591 79
noutram 0:9d6d139b1591 80 // TRY EACH OF THESE LINES IN TURN.
noutram 0:9d6d139b1591 81 // ALL IT DOES IS CHANGE THE TIMING OF THE ISR, NOT THE FUNCTION
noutram 0:9d6d139b1591 82
noutram 0:9d6d139b1591 83 if (button == PRESSED) {
noutram 0:9d6d139b1591 84 //VERSION 2: short delay allowing main to be preempted - you might want to tweak this value
noutram 2:5d467e30afbd 85 t1.attach_us(&countDown, 15);
noutram 0:9d6d139b1591 86 } else {
noutram 0:9d6d139b1591 87 //VERSION 1: 2s - ENOUGH TIME FOR COUNTUP TO FINISH
noutram 0:9d6d139b1591 88 t1.attach(&countDown, 2);
noutram 0:9d6d139b1591 89 }
noutram 0:9d6d139b1591 90
noutram 0:9d6d139b1591 91 //Run count up on the main thread
noutram 0:9d6d139b1591 92 countUp();
noutram 0:9d6d139b1591 93
noutram 3:e5c2bfd464f7 94
noutram 3:e5c2bfd464f7 95 //Now spin for ever
noutram 0:9d6d139b1591 96 while(1) {
noutram 3:e5c2bfd464f7 97 wait(0.5);
noutram 0:9d6d139b1591 98 };
noutram 0:9d6d139b1591 99 }
noutram 0:9d6d139b1591 100