avnish aggarwal
/
bootcamp-appdesign
evolution
main.cpp
- Committer:
- avnisha
- Date:
- 2014-02-05
- Revision:
- 1:02e0c04d84d3
- Parent:
- 0:f25a61b099e5
File content as of revision 1:02e0c04d84d3:
#include "mbed.h" /* * Based on * * http://mbed.org/users/AjK/notebook/regarding-interrupts-use-and-blocking/?c=9228 */ /* Specification: led1: flash briefly once per second, EVERY second. led2: On at t = 2 and off at t = 5 led3: On at t = 3 and off at t = 6 */ #define SIX #ifdef ONE /* * Basic processing looping * * Good - simple to write/debug * Bad - not so simple to add led2/led3 without some state machine logic and timer polling */ DigitalOut led1(LED1); int main() { while(1) { led1 = 1; wait(0.2); led1 = 0; wait(0.2); } } #endif #ifdef TWO /* * Event driven logic and loop together * * Good - led2 is getting serviced by callback * Bad - led1 will missing some flashes due to wait() in callback * */ Timeout to1; DigitalOut led1(LED1); DigitalOut led2(LED2); void cb1(void) { led2 = 1; wait(3); led2 = 0; } int main() { to1.attach(&cb1, 2); while(1) { led1 = 1; wait(0.05); led1 = 0; wait(0.95); } } #endif #ifdef THREE /* * Good - led1/led2/led3 all getting serviced * Bad - timing off on led3 since that callback has to wait for previous callback to finish * - timing off on led1 due to both callbacks wait() */ Timeout to1; Timeout to2; DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); void cb1(void) { led2 = 1; wait(3); led2 = 0; } void cb2(void) { led3 = 1; wait(3); led3 = 0; } int main() { to1.attach(&cb1, 2); to2.attach(&cb2, 3); while(1) { led1 = 1; wait(0.05); led1 = 0; wait(0.95); } } #endif #ifdef FOUR /* * Good - Use gloabls to coordinate callback/main loop - no wait() in callback * Bad - led1 uses wait() making it less effective for polling other devices */ Timeout to1; Timeout to2; DigitalOut led1(LED1); DigitalOut to1_led(LED2); DigitalOut to2_led(LED3); bool to1triggered = false; bool to2triggered = false; void cb1(void) { to1triggered = true; } void to1handle(void) { if (to1_led == 0) { to1_led = 1; to1.detach(); to1.attach(&cb1, 3); } else { to1_led = 0; to1.detach(); } } void cb2(void) { to2triggered = true; } void to2handle(void) { if (to2_led == 0) { to2_led = 1; to2.detach(); to2.attach(&cb2, 3); } else { to2_led = 0; to2.detach(); } } int main() { to1.attach(&cb1, 2); to2.attach(&cb2, 3); while(1) { if (to1triggered) { to1triggered = false; to1handle(); } if (to2triggered) { to2triggered = false; to2handle(); } led1 = 1; wait(0.05); led1 = 0; wait(0.95); } } #endif #ifdef FIVE /* * Good - all led's are callback interrupt driven * Bad - printf() in callback (interrupt context) bad idea */ #include "mbed.h" Ticker tled1on; Timeout tled1off; Timeout to1; Timeout to2; DigitalOut led1(LED1); DigitalOut to1_led(LED2); DigitalOut to2_led(LED3); void cb1(void) { if (to1_led == 0) { to1_led = 1; } else { to1_led = 0; } // Reschedule a new event. printf("cb1 callback\n"); to1.detach(); to1.attach(&cb1, 3); } void cb2(void) { if (to2_led == 0) { to2_led = 1; } else { to2_led = 0; } // Reschedule a new event. to2.detach(); to2.attach(&cb2, 3); } void tled1off_cb(void) { led1 = 0; } void tled1on_cb(void) { led1 = 1; tled1off.detach(); tled1off.attach(&tled1off_cb, 0.05); } int main() { led1 = 1; tled1off.attach(&tled1on_cb, 0.05); tled1on.attach(&tled1on_cb, 1); to1.attach(&cb1, 2); to2.attach(&cb2, 3); while(1) { // Calculate PI here as we have so much time } } #endif #ifdef SIX /* * Final version ... event driven for LED's */ Ticker tled1on; Timeout tled1off; Timeout to1; Timeout to2; DigitalOut led1(LED1); DigitalOut to1_led(LED2); DigitalOut to2_led(LED3); void cb1(void) { if (to1_led == 0) { to1_led = 1; } else { to1_led = 0; } // Reschedule a new event. to1.detach(); to1.attach(&cb1, 3); } void cb2(void) { if (to2_led == 0) { to2_led = 1; } else { to2_led = 0; } // Reschedule a new event. to2.detach(); to2.attach(&cb2, 3); } void tled1off_cb(void) { led1 = 0; } void tled1on_cb(void) { led1 = 1; tled1off.detach(); tled1off.attach(&tled1off_cb, 0.05); } int main() { led1 = 1; tled1off.attach(&tled1on_cb, 0.05); tled1on.attach(&tled1on_cb, 1); to1.attach(&cb1, 2); to2.attach(&cb2, 3); while(1) { // Calculate PI here as we have so much time :) printf("main loop\n"); } } #endif