Sebastian Barrera / Mbed OS Lab6
Committer:
sebbarpar
Date:
Thu Mar 26 11:02:19 2020 +0000
Revision:
9:5d1d36c2664f
Parent:
8:041c4841cd96
Child:
10:0edd1ab03f84
Lab6 V2;

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