Sebastian Barrera / Mbed OS Lab6
Committer:
sebbarpar
Date:
Thu Mar 26 09:54:53 2020 +0000
Revision:
8:041c4841cd96
Parent:
7:e49685bca7c7
Child:
9:5d1d36c2664f
Lab6;

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