Sebastian Barrera / Mbed OS Lab6
Committer:
sebbarpar
Date:
Thu Apr 02 18:01:13 2020 +0000
Revision:
10:0edd1ab03f84
Parent:
9:5d1d36c2664f
Child:
11:e697f0c49466
Final version;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Manel_Marin 0:5ce3cfc57999 1 #include "mbed.h"
WilliamMarshQMUL 1:159a09ac60ba 2 #include "wdt.h"
sebbarpar 10:0edd1ab03f84 3 // Lab 6
WilliamMarshQMUL 2:c31a1758ac38 4 // ---------------------------------
WilliamMarshQMUL 3:32a940251192 5 // * Three threads co-operate to flash two LEDs
WilliamMarshQMUL 3:32a940251192 6 // * A simple way to inject a fault, by pressing a button
sebbarpar 8:041c4841cd96 7 // * The watchdog is configured with a 1024ms timeout
sebbarpar 10:0edd1ab03f84 8 // * To kick the watchdog, both LED threads must set a signal that is received by another thread which kicks it
sebbarpar 10:0edd1ab03f84 9 // * If hardware fails, turn on red on-board LED.
sebbarpar 10:0edd1ab03f84 10
sebbarpar 10:0edd1ab03f84 11 //This code was tested, since I had the KL25Z available
WilliamMarshQMUL 3:32a940251192 12
WilliamMarshQMUL 3:32a940251192 13 #define ON 1
WilliamMarshQMUL 3:32a940251192 14 #define OFF 0
WilliamMarshQMUL 3:32a940251192 15 DigitalOut led_red(LED_RED, ON);
WilliamMarshQMUL 3:32a940251192 16 DigitalIn button(PTD0, PullUp);
WilliamMarshQMUL 3:32a940251192 17 DigitalOut led1(PTC12, OFF);
WilliamMarshQMUL 3:32a940251192 18 DigitalOut led2(PTC13, OFF);
sebbarpar 9:5d1d36c2664f 19 DigitalOut redled(LED1,ON);
sebbarpar 8:041c4841cd96 20 AnalogIn ain(PTB0) ;
sebbarpar 8:041c4841cd96 21 AnalogIn anin(PTE20) ;
WilliamMarshQMUL 6:8b0ca28c88a4 22 Serial pc(USBTX, USBRX); // tx, rx, useful for debugging
WilliamMarshQMUL 3:32a940251192 23 Ticker tick;
WilliamMarshQMUL 3:32a940251192 24
WilliamMarshQMUL 3:32a940251192 25 // Threads
sebbarpar 8:041c4841cd96 26 Thread threadT(osPriorityNormal, 2000); ; // timer thread
sebbarpar 8:041c4841cd96 27 Thread threadLED1(osPriorityNormal, 2000); ; // thread LED1
sebbarpar 8:041c4841cd96 28 Thread threadLED2(osPriorityNormal, 2000); ; // thread LED2
sebbarpar 9:5d1d36c2664f 29 Thread threadkick(osPriorityNormal, 2000); ; // thread LED2
WilliamMarshQMUL 3:32a940251192 30
sebbarpar 8:041c4841cd96 31 # define ON1 (1UL << 0)
sebbarpar 8:041c4841cd96 32 # define ON2 (1UL << 1)
sebbarpar 8:041c4841cd96 33 # define OFF1 (1UL << 2)
sebbarpar 8:041c4841cd96 34 # define OFF2 (1UL << 3)
sebbarpar 9:5d1d36c2664f 35 # define kick1 (1UL << 4)
sebbarpar 9:5d1d36c2664f 36 # define kick2 (1UL << 5)
WilliamMarshQMUL 6:8b0ca28c88a4 37 EventFlags signals; // event flags for signalling
WilliamMarshQMUL 6:8b0ca28c88a4 38
WilliamMarshQMUL 6:8b0ca28c88a4 39
WilliamMarshQMUL 3:32a940251192 40 // ------------Fault Injection Button-------------
WilliamMarshQMUL 3:32a940251192 41 // Wait while the button is down
WilliamMarshQMUL 3:32a940251192 42 // Use this to simulate a STUCK fault
WilliamMarshQMUL 3:32a940251192 43 // -----------------------------------------------
WilliamMarshQMUL 3:32a940251192 44 void waitButton() {
WilliamMarshQMUL 3:32a940251192 45 while (!button) ;
WilliamMarshQMUL 3:32a940251192 46 }
WilliamMarshQMUL 2:c31a1758ac38 47
sebbarpar 9:5d1d36c2664f 48 void kickthread(){
sebbarpar 9:5d1d36c2664f 49 while(1){
sebbarpar 9:5d1d36c2664f 50 signals.wait_all(kick1, kick2);
sebbarpar 9:5d1d36c2664f 51 wdt_kickA();//kick watchdog channel A
sebbarpar 9:5d1d36c2664f 52 }
sebbarpar 9:5d1d36c2664f 53 }
sebbarpar 9:5d1d36c2664f 54
WilliamMarshQMUL 3:32a940251192 55 // ---Thread for controlling LED 1----------------
WilliamMarshQMUL 3:32a940251192 56 // Turn LED1 on/off in response to signals
WilliamMarshQMUL 3:32a940251192 57 // -----------------------------------------------
WilliamMarshQMUL 3:32a940251192 58 void led1_thread() { // method to run in thread
WilliamMarshQMUL 6:8b0ca28c88a4 59 int evt ;
WilliamMarshQMUL 3:32a940251192 60 while (true) {
sebbarpar 9:5d1d36c2664f 61 evt = signals.wait_any(ON1 | OFF1); // wait for either signal
WilliamMarshQMUL 6:8b0ca28c88a4 62 if (evt & ON1) led1 = ON ;
WilliamMarshQMUL 6:8b0ca28c88a4 63 if (evt & OFF1) led1 = OFF ;
sebbarpar 9:5d1d36c2664f 64 signals.set(kick1);
sebbarpar 8:041c4841cd96 65 //waitButton() ; // POSSIBLE FAULT HERE
WilliamMarshQMUL 3:32a940251192 66 }
WilliamMarshQMUL 3:32a940251192 67 }
Manel_Marin 0:5ce3cfc57999 68
WilliamMarshQMUL 3:32a940251192 69 // ---Thread for controlling LED 2----------------
WilliamMarshQMUL 3:32a940251192 70 // Turn LED2 on/off in response to signals
WilliamMarshQMUL 3:32a940251192 71 // -----------------------------------------------
WilliamMarshQMUL 3:32a940251192 72 void led2_thread() { // method to run in thread
WilliamMarshQMUL 6:8b0ca28c88a4 73 int evt ;
WilliamMarshQMUL 3:32a940251192 74 while (true) {
sebbarpar 9:5d1d36c2664f 75 evt = signals.wait_any(ON2 | OFF2); // wait for any signal
WilliamMarshQMUL 6:8b0ca28c88a4 76 if (evt & ON2) led2 = ON ;
WilliamMarshQMUL 6:8b0ca28c88a4 77 if (evt & OFF2) led2 = OFF ;
sebbarpar 9:5d1d36c2664f 78 signals.set(kick2);
WilliamMarshQMUL 3:32a940251192 79 // waitButton() ; // POSSIBLE FAULT HERE
WilliamMarshQMUL 3:32a940251192 80 }
WilliamMarshQMUL 3:32a940251192 81 }
Manel_Marin 0:5ce3cfc57999 82
WilliamMarshQMUL 3:32a940251192 83 // ---Thread for timing --------------------------
WilliamMarshQMUL 3:32a940251192 84 // Send signals to the other threads
WilliamMarshQMUL 3:32a940251192 85 // -----------------------------------------------
WilliamMarshQMUL 3:32a940251192 86 void timer_thread() { // method to run in thread
WilliamMarshQMUL 3:32a940251192 87 while (true) {
WilliamMarshQMUL 7:e49685bca7c7 88 ThisThread::sleep_for(1000) ;
WilliamMarshQMUL 6:8b0ca28c88a4 89 signals.set(ON1 | ON2) ;
WilliamMarshQMUL 7:e49685bca7c7 90 ThisThread::sleep_for(1000) ;
WilliamMarshQMUL 6:8b0ca28c88a4 91 signals.set(OFF1 | OFF2) ;
WilliamMarshQMUL 3:32a940251192 92 // waitButton() ; // POSSIBLE FAULT HERE
WilliamMarshQMUL 3:32a940251192 93 }
WilliamMarshQMUL 3:32a940251192 94 }
WilliamMarshQMUL 3:32a940251192 95
WilliamMarshQMUL 3:32a940251192 96 // -----------MAIN-------------------------------
WilliamMarshQMUL 3:32a940251192 97 // Configure watchdog. Start threads.
WilliamMarshQMUL 3:32a940251192 98 // Show start up with RED for 1sec
WilliamMarshQMUL 3:32a940251192 99 // Remember the watchdog is running
WilliamMarshQMUL 3:32a940251192 100 // - 1024ms to set it once
sebbarpar 8:041c4841cd96 101 // - then must feed it every 1024ms
WilliamMarshQMUL 3:32a940251192 102 // ----------------------------------------------
Manel_Marin 0:5ce3cfc57999 103
Manel_Marin 0:5ce3cfc57999 104 int main(void) {
sebbarpar 8:041c4841cd96 105 float volts = 0 ;
sebbarpar 8:041c4841cd96 106 float volts2=0;
sebbarpar 8:041c4841cd96 107 int counter = 0 ;
sebbarpar 8:041c4841cd96 108 wdt_1sec() ; // initialise watchdog - 1s timeout
sebbarpar 8:041c4841cd96 109 wdt_kick_all() ;
sebbarpar 8:041c4841cd96 110
WilliamMarshQMUL 3:32a940251192 111 // start threads
WilliamMarshQMUL 6:8b0ca28c88a4 112 threadT.start(timer_thread) ; // start the timer thread
WilliamMarshQMUL 6:8b0ca28c88a4 113 threadLED1.start(led1_thread) ; // start the LED1 control thread
WilliamMarshQMUL 6:8b0ca28c88a4 114 threadLED2.start(led2_thread) ; // start the LED2 control thread
sebbarpar 9:5d1d36c2664f 115 threadkick.start(kickthread); // start the thread to kick watchdog
sebbarpar 8:041c4841cd96 116 //printf("\nRESTART\n");// Debugging
sebbarpar 8:041c4841cd96 117 while (true) {
sebbarpar 8:041c4841cd96 118 if (led1==ON || led2==ON){//Only check when LEDs are on
sebbarpar 9:5d1d36c2664f 119 wdt_kickB();//Kick watchdog channel B
sebbarpar 8:041c4841cd96 120 volts=ain.read();
sebbarpar 8:041c4841cd96 121 volts=volts*3.3;
sebbarpar 8:041c4841cd96 122 volts2=anin.read()*3.3;
sebbarpar 8:041c4841cd96 123 //Voltage with LEDs on is around 1.2V, since the resistances available were not of 680ohms.
sebbarpar 10:0edd1ab03f84 124 if (volts>1.5 || volts2>1.5 || volts<0.5 || volts2<0.5){redled=0;}//Turn on on-board LED
sebbarpar 8:041c4841cd96 125 }
sebbarpar 8:041c4841cd96 126 //printf("volts: %f volts 2: %f", volts, volts2);//Debugging
sebbarpar 9:5d1d36c2664f 127 volts=0; volts2=0;
sebbarpar 8:041c4841cd96 128 wait(0.1f);
sebbarpar 8:041c4841cd96 129 }
sebbarpar 8:041c4841cd96 130
WilliamMarshQMUL 7:e49685bca7c7 131
Manel_Marin 0:5ce3cfc57999 132 }