Example software for a Cyclic Executive
Dependencies: MCP23017 SDFileSystem WattBob_TextLCD mbed
main.cpp@7:2973bf297f3d, 2016-03-02 (annotated)
- Committer:
- sk398
- Date:
- Wed Mar 02 00:51:17 2016 +0000
- Revision:
- 7:2973bf297f3d
- Parent:
- 6:ceda53939eb8
- Child:
- 8:7f3594882cec
All tasks bar 2 and 3 Operational with relatively good timing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sk398 | 4:b85bc0d810e1 | 1 | /* ##################################################################### |
sk398 | 4:b85bc0d810e1 | 2 | main.cpp |
sk398 | 4:b85bc0d810e1 | 3 | --------- |
sk398 | 4:b85bc0d810e1 | 4 | |
sk398 | 4:b85bc0d810e1 | 5 | Embedded Software - Assignment 2 |
sk398 | 4:b85bc0d810e1 | 6 | -------------------------------- |
sk398 | 4:b85bc0d810e1 | 7 | |
sk398 | 4:b85bc0d810e1 | 8 | Written by: Steven Kay |
sk398 | 4:b85bc0d810e1 | 9 | |
sk398 | 4:b85bc0d810e1 | 10 | Date: February 2016 |
sk398 | 4:b85bc0d810e1 | 11 | |
sk398 | 4:b85bc0d810e1 | 12 | Function: This |
sk398 | 4:b85bc0d810e1 | 13 | |
sk398 | 4:b85bc0d810e1 | 14 | Version: 1.0 |
sk398 | 4:b85bc0d810e1 | 15 | |
sk398 | 4:b85bc0d810e1 | 16 | Version History |
sk398 | 4:b85bc0d810e1 | 17 | --------------- |
sk398 | 4:b85bc0d810e1 | 18 | |
sk398 | 4:b85bc0d810e1 | 19 | 1.1 rgdfgdfgdfggdfgdg |
sk398 | 4:b85bc0d810e1 | 20 | |
sk398 | 4:b85bc0d810e1 | 21 | 1.0 gdgddfdddgd |
sk398 | 4:b85bc0d810e1 | 22 | |
sk398 | 4:b85bc0d810e1 | 23 | ##################################################################### */ |
sk398 | 2:22ebabd78084 | 24 | |
sk398 | 0:5989ac10c4d3 | 25 | #include "mbed.h" |
sk398 | 1:221d677fe0d3 | 26 | #include "Tasks.h" |
sk398 | 0:5989ac10c4d3 | 27 | |
sk398 | 7:2973bf297f3d | 28 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 29 | // Task Declerations |
sk398 | 7:2973bf297f3d | 30 | // ============================================================================ |
sk398 | 6:ceda53939eb8 | 31 | Task1 task1(p11); // Square wave Measurement |
sk398 | 7:2973bf297f3d | 32 | Task2 task2_switch1(p12); // Read digital Input |
sk398 | 6:ceda53939eb8 | 33 | Task3 task3(p13); // Watchdog Pulse |
sk398 | 6:ceda53939eb8 | 34 | Task4 task4(p15,p16); // Read analog Inputs |
sk398 | 6:ceda53939eb8 | 35 | Task5 task5(p9,p10,0x40); // Output to LCD Display |
sk398 | 6:ceda53939eb8 | 36 | Task6 task6; // Logical checks |
sk398 | 6:ceda53939eb8 | 37 | Task7 task7(p5,p6,p7,p8,"SD","/SD/A2"); // SD Card Write |
sk398 | 0:5989ac10c4d3 | 38 | |
sk398 | 7:2973bf297f3d | 39 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 40 | // Cyclic Executive Objects and Declerations |
sk398 | 7:2973bf297f3d | 41 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 42 | DigitalOut ErrorLED(LED1); // Error Indicating LED |
sk398 | 7:2973bf297f3d | 43 | DigitalOut LenPin(p21); // Pulse Pin |
sk398 | 7:2973bf297f3d | 44 | DigitalIn SDRemoval(p18); // Switch state to indicate to remove SD |
sk398 | 7:2973bf297f3d | 45 | Timer BusyWait; // Wasted time Timer |
sk398 | 7:2973bf297f3d | 46 | Ticker CyclicTicker; // Ticker object to cycle tasks |
sk398 | 7:2973bf297f3d | 47 | |
sk398 | 7:2973bf297f3d | 48 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 49 | // Global Data Parameters used in Cyclic Executive |
sk398 | 7:2973bf297f3d | 50 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 51 | // Counter to record the number of ticks went through by the Cyclic Executive |
sk398 | 7:2973bf297f3d | 52 | int cyclicTicks = 1; |
sk398 | 7:2973bf297f3d | 53 | |
sk398 | 7:2973bf297f3d | 54 | // Global parameter storing the most up to date value of the return from Task 1 |
sk398 | 7:2973bf297f3d | 55 | volatile int task1Frequency; |
sk398 | 7:2973bf297f3d | 56 | |
sk398 | 7:2973bf297f3d | 57 | // Global parameter storing the most up to date value of the return from Task 2 |
sk398 | 7:2973bf297f3d | 58 | volatile int task2SwitchState; |
sk398 | 7:2973bf297f3d | 59 | |
sk398 | 7:2973bf297f3d | 60 | // Global parameter storing the most up to date value of the return from Task 4 |
sk398 | 7:2973bf297f3d | 61 | volatile float task4AnalogChannels[2]; |
sk398 | 7:2973bf297f3d | 62 | |
sk398 | 7:2973bf297f3d | 63 | // Global parameter storing the most up to date value of the return from Task 6 |
sk398 | 7:2973bf297f3d | 64 | volatile int task6ErrorState; |
sk398 | 7:2973bf297f3d | 65 | |
sk398 | 7:2973bf297f3d | 66 | // Char array to store the concatenated string for output onto the SD Card |
sk398 | 7:2973bf297f3d | 67 | char logData[50]; |
sk398 | 7:2973bf297f3d | 68 | |
sk398 | 7:2973bf297f3d | 69 | int slotCounter = 0; |
sk398 | 7:2973bf297f3d | 70 | int taskNum = 2; |
sk398 | 7:2973bf297f3d | 71 | |
sk398 | 7:2973bf297f3d | 72 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 73 | // Cyclic Executive Function Prototypes |
sk398 | 7:2973bf297f3d | 74 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 75 | void CyclicExec(); |
sk398 | 7:2973bf297f3d | 76 | |
sk398 | 7:2973bf297f3d | 77 | // ============================================================================ |
sk398 | 7:2973bf297f3d | 78 | // Main Execution Program |
sk398 | 7:2973bf297f3d | 79 | // ============================================================================ |
sk398 | 0:5989ac10c4d3 | 80 | int main() { |
sk398 | 7:2973bf297f3d | 81 | |
sk398 | 7:2973bf297f3d | 82 | // Attempt to open SD file |
sk398 | 7:2973bf297f3d | 83 | // If open failed, do not run Cyclic Exec |
sk398 | 7:2973bf297f3d | 84 | if(!task7.openFile("/SD/A2/test.csv","a")) |
sk398 | 7:2973bf297f3d | 85 | { |
sk398 | 7:2973bf297f3d | 86 | // Start Cyclic Executive |
sk398 | 7:2973bf297f3d | 87 | CyclicTicker.attach(&CyclicExec,0.025); // 25ms pulses |
sk398 | 7:2973bf297f3d | 88 | |
sk398 | 7:2973bf297f3d | 89 | // Keep program running until RESET |
sk398 | 7:2973bf297f3d | 90 | while(1) |
sk398 | 7:2973bf297f3d | 91 | { |
sk398 | 7:2973bf297f3d | 92 | } |
sk398 | 7:2973bf297f3d | 93 | } |
sk398 | 4:b85bc0d810e1 | 94 | |
sk398 | 7:2973bf297f3d | 95 | // If FIle is not opened, prompt user and show Error on LED |
sk398 | 6:ceda53939eb8 | 96 | else |
sk398 | 6:ceda53939eb8 | 97 | { |
sk398 | 7:2973bf297f3d | 98 | // Prompt user about error |
sk398 | 7:2973bf297f3d | 99 | printf("File not opened\r\nNot executing Cyclic Executive"); |
sk398 | 7:2973bf297f3d | 100 | |
sk398 | 7:2973bf297f3d | 101 | // Execute error code on LED |
sk398 | 7:2973bf297f3d | 102 | while(1) |
sk398 | 7:2973bf297f3d | 103 | { |
sk398 | 7:2973bf297f3d | 104 | ErrorLED = 1; |
sk398 | 7:2973bf297f3d | 105 | wait(1); |
sk398 | 7:2973bf297f3d | 106 | ErrorLED = 0; |
sk398 | 7:2973bf297f3d | 107 | wait(1); |
sk398 | 7:2973bf297f3d | 108 | } |
sk398 | 7:2973bf297f3d | 109 | } |
sk398 | 7:2973bf297f3d | 110 | } |
sk398 | 7:2973bf297f3d | 111 | |
sk398 | 7:2973bf297f3d | 112 | Timer stampTime; |
sk398 | 7:2973bf297f3d | 113 | |
sk398 | 7:2973bf297f3d | 114 | #define TASK1_TICKS 40 |
sk398 | 7:2973bf297f3d | 115 | #define TASK2_TICKS 12 |
sk398 | 7:2973bf297f3d | 116 | #define TASK3_TICKS 12 |
sk398 | 7:2973bf297f3d | 117 | #define TASK4_TICKS 16 |
sk398 | 7:2973bf297f3d | 118 | #define TASK5_TICKS 80 |
sk398 | 7:2973bf297f3d | 119 | #define TASK6_TICKS 32 |
sk398 | 7:2973bf297f3d | 120 | #define TASK7_TICKS 200 |
sk398 | 7:2973bf297f3d | 121 | |
sk398 | 7:2973bf297f3d | 122 | #define HIGH 1 |
sk398 | 7:2973bf297f3d | 123 | |
sk398 | 7:2973bf297f3d | 124 | //void CyclicExec() |
sk398 | 7:2973bf297f3d | 125 | //{ |
sk398 | 7:2973bf297f3d | 126 | // slotCounter++; |
sk398 | 7:2973bf297f3d | 127 | // switch(slotCounter) |
sk398 | 7:2973bf297f3d | 128 | // { |
sk398 | 7:2973bf297f3d | 129 | // case 1: |
sk398 | 7:2973bf297f3d | 130 | // if(cyclicTicks % TASK1_TICKS == 0) |
sk398 | 7:2973bf297f3d | 131 | // { |
sk398 | 7:2973bf297f3d | 132 | //// printf("T1\r\n"); |
sk398 | 7:2973bf297f3d | 133 | // task1Frequency = task1.ReadFrequency(); |
sk398 | 7:2973bf297f3d | 134 | // } |
sk398 | 7:2973bf297f3d | 135 | // break; |
sk398 | 7:2973bf297f3d | 136 | // |
sk398 | 7:2973bf297f3d | 137 | // case 2: |
sk398 | 7:2973bf297f3d | 138 | // if(cyclicTicks % TASK2_TICKS == 0) |
sk398 | 7:2973bf297f3d | 139 | // { |
sk398 | 7:2973bf297f3d | 140 | //// printf("T2\r\n"); |
sk398 | 7:2973bf297f3d | 141 | // task2SwitchState = task2_switch1.digitalInState(); |
sk398 | 7:2973bf297f3d | 142 | // } |
sk398 | 7:2973bf297f3d | 143 | // break; |
sk398 | 7:2973bf297f3d | 144 | // |
sk398 | 7:2973bf297f3d | 145 | // case 3: |
sk398 | 7:2973bf297f3d | 146 | // if(cyclicTicks % TASK3_TICKS == 0) |
sk398 | 7:2973bf297f3d | 147 | // { |
sk398 | 7:2973bf297f3d | 148 | //// printf("T3 ------ \r\n"); |
sk398 | 7:2973bf297f3d | 149 | // LenPin = 1; |
sk398 | 7:2973bf297f3d | 150 | // task3.OutputWatchdogPulse(); |
sk398 | 7:2973bf297f3d | 151 | // LenPin = 0; |
sk398 | 7:2973bf297f3d | 152 | // } |
sk398 | 7:2973bf297f3d | 153 | // break; |
sk398 | 7:2973bf297f3d | 154 | // |
sk398 | 7:2973bf297f3d | 155 | // case 4: |
sk398 | 7:2973bf297f3d | 156 | // if(cyclicTicks % TASK4_TICKS == 0) |
sk398 | 7:2973bf297f3d | 157 | // { |
sk398 | 7:2973bf297f3d | 158 | //// printf("T4\r\n"); |
sk398 | 7:2973bf297f3d | 159 | // float *analogReading = task4.returnAnalogReadings(); |
sk398 | 7:2973bf297f3d | 160 | // task4AnalogChannels[0] = *(analogReading); |
sk398 | 7:2973bf297f3d | 161 | // task4AnalogChannels[1]= *(analogReading+1); |
sk398 | 7:2973bf297f3d | 162 | // } |
sk398 | 7:2973bf297f3d | 163 | // break; |
sk398 | 7:2973bf297f3d | 164 | // |
sk398 | 7:2973bf297f3d | 165 | // case 5: |
sk398 | 7:2973bf297f3d | 166 | // if(cyclicTicks % TASK5_TICKS == 0) |
sk398 | 7:2973bf297f3d | 167 | // { |
sk398 | 7:2973bf297f3d | 168 | //// printf("T5\r\n"); |
sk398 | 7:2973bf297f3d | 169 | // task5.updateDisplay( task1Frequency, |
sk398 | 7:2973bf297f3d | 170 | // task2SwitchState, |
sk398 | 7:2973bf297f3d | 171 | // task6ErrorState, |
sk398 | 7:2973bf297f3d | 172 | // task4AnalogChannels[0], |
sk398 | 7:2973bf297f3d | 173 | // task4AnalogChannels[1] ); |
sk398 | 7:2973bf297f3d | 174 | // } |
sk398 | 7:2973bf297f3d | 175 | // break; |
sk398 | 7:2973bf297f3d | 176 | // |
sk398 | 7:2973bf297f3d | 177 | // case 10: |
sk398 | 7:2973bf297f3d | 178 | // if(cyclicTicks % TASK6_TICKS == 0) |
sk398 | 7:2973bf297f3d | 179 | // { |
sk398 | 7:2973bf297f3d | 180 | //// printf("T6\r\n"); |
sk398 | 7:2973bf297f3d | 181 | // task6ErrorState = task6.updateErrorCode( task2SwitchState, |
sk398 | 7:2973bf297f3d | 182 | // task4AnalogChannels[0], |
sk398 | 7:2973bf297f3d | 183 | // task4AnalogChannels[1] ); |
sk398 | 7:2973bf297f3d | 184 | // } |
sk398 | 7:2973bf297f3d | 185 | // break; |
sk398 | 7:2973bf297f3d | 186 | // |
sk398 | 7:2973bf297f3d | 187 | // case 11: |
sk398 | 7:2973bf297f3d | 188 | // if(cyclicTicks % TASK7_TICKS == 0) |
sk398 | 7:2973bf297f3d | 189 | // { |
sk398 | 7:2973bf297f3d | 190 | //// printf("T7\r\n"); |
sk398 | 7:2973bf297f3d | 191 | // int a = sprintf( logData,"Freq=%d,SW1=%d,A1=%1.3f,A2=%1.3f\n", |
sk398 | 7:2973bf297f3d | 192 | // task1Frequency, |
sk398 | 7:2973bf297f3d | 193 | // task2SwitchState, |
sk398 | 7:2973bf297f3d | 194 | // task4AnalogChannels[0], |
sk398 | 7:2973bf297f3d | 195 | // task4AnalogChannels[1] ); |
sk398 | 7:2973bf297f3d | 196 | // task7.writeData(logData); |
sk398 | 7:2973bf297f3d | 197 | // } |
sk398 | 7:2973bf297f3d | 198 | // break; |
sk398 | 7:2973bf297f3d | 199 | // |
sk398 | 7:2973bf297f3d | 200 | // case 12: |
sk398 | 7:2973bf297f3d | 201 | // slotCounter = 0; |
sk398 | 7:2973bf297f3d | 202 | // cyclicTicks++; |
sk398 | 7:2973bf297f3d | 203 | // break; |
sk398 | 7:2973bf297f3d | 204 | // } |
sk398 | 7:2973bf297f3d | 205 | // if(SDRemoval == HIGH) |
sk398 | 7:2973bf297f3d | 206 | // { |
sk398 | 7:2973bf297f3d | 207 | // printf("Shutting File"); |
sk398 | 7:2973bf297f3d | 208 | // task7.closeFile(); |
sk398 | 7:2973bf297f3d | 209 | // } |
sk398 | 7:2973bf297f3d | 210 | // |
sk398 | 7:2973bf297f3d | 211 | // |
sk398 | 7:2973bf297f3d | 212 | //} |
sk398 | 7:2973bf297f3d | 213 | |
sk398 | 7:2973bf297f3d | 214 | Timer task1t; |
sk398 | 7:2973bf297f3d | 215 | Timer task2t; |
sk398 | 7:2973bf297f3d | 216 | Timer task3t; |
sk398 | 7:2973bf297f3d | 217 | Timer task4t; |
sk398 | 7:2973bf297f3d | 218 | Timer task5t; |
sk398 | 7:2973bf297f3d | 219 | Timer task6t; |
sk398 | 7:2973bf297f3d | 220 | |
sk398 | 7:2973bf297f3d | 221 | void CyclicExec() |
sk398 | 7:2973bf297f3d | 222 | { |
sk398 | 7:2973bf297f3d | 223 | cyclicTicks++; |
sk398 | 7:2973bf297f3d | 224 | if(cyclicTicks % 200 == 0) |
sk398 | 7:2973bf297f3d | 225 | { |
sk398 | 7:2973bf297f3d | 226 | stampTime.stop(); |
sk398 | 7:2973bf297f3d | 227 | printf("T7\r\n"); |
sk398 | 7:2973bf297f3d | 228 | int a = sprintf( logData,"Time=%1.2f,Freq=%d,SW1=%d,A1=%1.3f,A2=%1.3f\n", |
sk398 | 7:2973bf297f3d | 229 | stampTime.read(), |
sk398 | 7:2973bf297f3d | 230 | task1Frequency, |
sk398 | 7:2973bf297f3d | 231 | task2SwitchState, |
sk398 | 7:2973bf297f3d | 232 | task4AnalogChannels[0], |
sk398 | 7:2973bf297f3d | 233 | task4AnalogChannels[1] ); |
sk398 | 7:2973bf297f3d | 234 | task7.writeData(logData); |
sk398 | 7:2973bf297f3d | 235 | stampTime.reset(); |
sk398 | 7:2973bf297f3d | 236 | stampTime.start(); |
sk398 | 7:2973bf297f3d | 237 | } |
sk398 | 7:2973bf297f3d | 238 | |
sk398 | 7:2973bf297f3d | 239 | if(cyclicTicks % 80 == 0) |
sk398 | 7:2973bf297f3d | 240 | { |
sk398 | 7:2973bf297f3d | 241 | task5t.stop(); |
sk398 | 7:2973bf297f3d | 242 | printf("T5 %1.2f\r\n",task5t.read()); |
sk398 | 7:2973bf297f3d | 243 | task5.updateDisplay( task1Frequency, |
sk398 | 7:2973bf297f3d | 244 | task2SwitchState, |
sk398 | 7:2973bf297f3d | 245 | task6ErrorState, |
sk398 | 7:2973bf297f3d | 246 | task4AnalogChannels[0], |
sk398 | 7:2973bf297f3d | 247 | task4AnalogChannels[1] ); |
sk398 | 7:2973bf297f3d | 248 | task5t.reset(); |
sk398 | 7:2973bf297f3d | 249 | task5t.start(); |
sk398 | 7:2973bf297f3d | 250 | } |
sk398 | 7:2973bf297f3d | 251 | |
sk398 | 7:2973bf297f3d | 252 | if(cyclicTicks % 40 == 0) |
sk398 | 7:2973bf297f3d | 253 | { |
sk398 | 7:2973bf297f3d | 254 | task1t.stop(); |
sk398 | 7:2973bf297f3d | 255 | printf("T1 %d\r\n",task1t.read_ms()); |
sk398 | 7:2973bf297f3d | 256 | task1Frequency = task1.ReadFrequency(); |
sk398 | 7:2973bf297f3d | 257 | task1t.reset(); |
sk398 | 7:2973bf297f3d | 258 | task1t.start(); |
sk398 | 6:ceda53939eb8 | 259 | } |
sk398 | 6:ceda53939eb8 | 260 | |
sk398 | 7:2973bf297f3d | 261 | if(cyclicTicks % 32 == 0) |
sk398 | 7:2973bf297f3d | 262 | { |
sk398 | 7:2973bf297f3d | 263 | task6t.stop(); |
sk398 | 7:2973bf297f3d | 264 | printf("T6 %d\r\n",task6t.read_ms()); |
sk398 | 7:2973bf297f3d | 265 | task6ErrorState = task6.updateErrorCode( task2SwitchState, |
sk398 | 7:2973bf297f3d | 266 | task4AnalogChannels[0], |
sk398 | 7:2973bf297f3d | 267 | task4AnalogChannels[1] ); |
sk398 | 7:2973bf297f3d | 268 | task6t.reset(); |
sk398 | 7:2973bf297f3d | 269 | task6t.start(); |
sk398 | 7:2973bf297f3d | 270 | } |
sk398 | 7:2973bf297f3d | 271 | |
sk398 | 7:2973bf297f3d | 272 | if(cyclicTicks % 16 == 0) |
sk398 | 7:2973bf297f3d | 273 | { |
sk398 | 7:2973bf297f3d | 274 | task4t.stop(); |
sk398 | 7:2973bf297f3d | 275 | printf("T4 %d\r\n",task4t.read_ms()); |
sk398 | 7:2973bf297f3d | 276 | float *analogReading = task4.returnAnalogReadings(); |
sk398 | 7:2973bf297f3d | 277 | task4AnalogChannels[0] = *(analogReading); |
sk398 | 7:2973bf297f3d | 278 | task4AnalogChannels[1]= *(analogReading+1); |
sk398 | 7:2973bf297f3d | 279 | task4t.reset(); |
sk398 | 7:2973bf297f3d | 280 | task4t.start(); |
sk398 | 0:5989ac10c4d3 | 281 | } |
sk398 | 7:2973bf297f3d | 282 | |
sk398 | 7:2973bf297f3d | 283 | if(cyclicTicks & 13 == 0) |
sk398 | 7:2973bf297f3d | 284 | { |
sk398 | 7:2973bf297f3d | 285 | printf("IM IN TASK 3!!!!!!!!!!!!!!!!!!!!!"); |
sk398 | 7:2973bf297f3d | 286 | task3t.stop(); |
sk398 | 7:2973bf297f3d | 287 | printf("T3 %d\r\n",task3t.read_ms()); |
sk398 | 7:2973bf297f3d | 288 | task3.OutputWatchdogPulse(); |
sk398 | 7:2973bf297f3d | 289 | taskNum = 2; |
sk398 | 7:2973bf297f3d | 290 | task3t.reset(); |
sk398 | 7:2973bf297f3d | 291 | task3t.start(); |
sk398 | 7:2973bf297f3d | 292 | } |
sk398 | 7:2973bf297f3d | 293 | |
sk398 | 7:2973bf297f3d | 294 | if(cyclicTicks % 12 == 0) |
sk398 | 7:2973bf297f3d | 295 | { |
sk398 | 7:2973bf297f3d | 296 | printf("IM IN TASK 2!!!!!!!!!!!!!!!!!!!!!"); |
sk398 | 7:2973bf297f3d | 297 | task2t.stop(); |
sk398 | 7:2973bf297f3d | 298 | printf("T2 %d\r\n",task2t.read_ms()); |
sk398 | 7:2973bf297f3d | 299 | task2SwitchState = task2_switch1.digitalInState(); |
sk398 | 7:2973bf297f3d | 300 | taskNum = 3; |
sk398 | 7:2973bf297f3d | 301 | task2t.reset(); |
sk398 | 7:2973bf297f3d | 302 | task2t.start(); |
sk398 | 7:2973bf297f3d | 303 | } |
sk398 | 7:2973bf297f3d | 304 | |
sk398 | 7:2973bf297f3d | 305 | if(SDRemoval == HIGH) |
sk398 | 7:2973bf297f3d | 306 | { |
sk398 | 7:2973bf297f3d | 307 | printf("SD Removed"); |
sk398 | 7:2973bf297f3d | 308 | task7.closeFile(); |
sk398 | 7:2973bf297f3d | 309 | } |
sk398 | 7:2973bf297f3d | 310 | } |
sk398 | 7:2973bf297f3d | 311 |