A test program to recreate the system hang bug if you don't have a putc in the interrupt routine handler...
main.cpp@0:e8a5f7dfa0bd, 2010-01-24 (annotated)
- Committer:
- leimgrub
- Date:
- Sun Jan 24 03:40:54 2010 +0000
- Revision:
- 0:e8a5f7dfa0bd
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leimgrub | 0:e8a5f7dfa0bd | 1 | #include "mbed.h" |
leimgrub | 0:e8a5f7dfa0bd | 2 | |
leimgrub | 0:e8a5f7dfa0bd | 3 | // Test app to cause program to suddently terminate when using serial interrupt... |
leimgrub | 0:e8a5f7dfa0bd | 4 | // Line 24 seems to be the important bit, but I don't really understand why? |
leimgrub | 0:e8a5f7dfa0bd | 5 | // Is it perhaps the putc is peroperly clearing the interrupt flag instead of the getc? |
leimgrub | 0:e8a5f7dfa0bd | 6 | |
leimgrub | 0:e8a5f7dfa0bd | 7 | |
leimgrub | 0:e8a5f7dfa0bd | 8 | // usb serial device defaults to 9600 baud, 8N1 on /dev/ttyACM0 (in Linux!) |
leimgrub | 0:e8a5f7dfa0bd | 9 | Serial pc(USBTX, USBRX); // tx, rx |
leimgrub | 0:e8a5f7dfa0bd | 10 | |
leimgrub | 0:e8a5f7dfa0bd | 11 | // debugging LEDs |
leimgrub | 0:e8a5f7dfa0bd | 12 | DigitalOut interrupt(LED1); |
leimgrub | 0:e8a5f7dfa0bd | 13 | DigitalOut tx(LED4); |
leimgrub | 0:e8a5f7dfa0bd | 14 | |
leimgrub | 0:e8a5f7dfa0bd | 15 | // one byte receive buffer |
leimgrub | 0:e8a5f7dfa0bd | 16 | char rx_byte; |
leimgrub | 0:e8a5f7dfa0bd | 17 | |
leimgrub | 0:e8a5f7dfa0bd | 18 | void handle() |
leimgrub | 0:e8a5f7dfa0bd | 19 | { |
leimgrub | 0:e8a5f7dfa0bd | 20 | interrupt = 1; |
leimgrub | 0:e8a5f7dfa0bd | 21 | //if(pc.readable()) // <--- this line doesn't matter either way... |
leimgrub | 0:e8a5f7dfa0bd | 22 | { |
leimgrub | 0:e8a5f7dfa0bd | 23 | rx_byte = pc.getc(); |
leimgrub | 0:e8a5f7dfa0bd | 24 | //pc.putc(rx_byte); // <--- WITHOUT THIS LINE, THE APPLICATION WILL HANG IF IT RECEIVES WHILE SENDING! |
leimgrub | 0:e8a5f7dfa0bd | 25 | } |
leimgrub | 0:e8a5f7dfa0bd | 26 | interrupt = 0; |
leimgrub | 0:e8a5f7dfa0bd | 27 | return; |
leimgrub | 0:e8a5f7dfa0bd | 28 | } |
leimgrub | 0:e8a5f7dfa0bd | 29 | |
leimgrub | 0:e8a5f7dfa0bd | 30 | int main() |
leimgrub | 0:e8a5f7dfa0bd | 31 | { |
leimgrub | 0:e8a5f7dfa0bd | 32 | interrupt = 0; |
leimgrub | 0:e8a5f7dfa0bd | 33 | tx = 0; |
leimgrub | 0:e8a5f7dfa0bd | 34 | pc.attach(handle); |
leimgrub | 0:e8a5f7dfa0bd | 35 | |
leimgrub | 0:e8a5f7dfa0bd | 36 | while(1) |
leimgrub | 0:e8a5f7dfa0bd | 37 | { |
leimgrub | 0:e8a5f7dfa0bd | 38 | // send a long string of bytes |
leimgrub | 0:e8a5f7dfa0bd | 39 | tx = 1; |
leimgrub | 0:e8a5f7dfa0bd | 40 | for(int i=0;i<20;i++) |
leimgrub | 0:e8a5f7dfa0bd | 41 | { |
leimgrub | 0:e8a5f7dfa0bd | 42 | pc.printf("If I receive while transmitting this I will crash...\r\n"); |
leimgrub | 0:e8a5f7dfa0bd | 43 | } |
leimgrub | 0:e8a5f7dfa0bd | 44 | tx = 0; |
leimgrub | 0:e8a5f7dfa0bd | 45 | |
leimgrub | 0:e8a5f7dfa0bd | 46 | wait(1.0); |
leimgrub | 0:e8a5f7dfa0bd | 47 | } |
leimgrub | 0:e8a5f7dfa0bd | 48 | } |