Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@10:0edd1ab03f84, 2020-04-02 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |