A test program to recreate the system hang bug if you don't have a putc in the interrupt routine handler...

Dependencies:   mbed

Committer:
leimgrub
Date:
Sun Jan 24 03:40:54 2010 +0000
Revision:
0:e8a5f7dfa0bd

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }