[gnoduino: 98/237] Moving serialEvent() calls from RX interrupts to main for() loop (after loop()).



commit 3a0f707c1d30fe98552ac831612102a6ac6a79e3
Author: David A. Mellis <d mellis arduino cc>
Date:   Wed Aug 31 15:52:56 2011 -0400

    Moving serialEvent() calls from RX interrupts to main for() loop (after loop()).
    
    http://code.google.com/p/arduino/issues/detail?id=584

 arduino/cores/arduino/HardwareSerial.cpp |   53 +++++++++++++++++++++++++++--
 arduino/cores/arduino/HardwareSerial.h   |    2 +
 arduino/cores/arduino/main.cpp           |    4 ++-
 3 files changed, 54 insertions(+), 5 deletions(-)
---
diff --git a/arduino/cores/arduino/HardwareSerial.cpp b/arduino/cores/arduino/HardwareSerial.cpp
index d6be218..3ed8d07 100644
--- a/arduino/cores/arduino/HardwareSerial.cpp
+++ b/arduino/cores/arduino/HardwareSerial.cpp
@@ -88,6 +88,8 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
 #else
   void serialEvent() __attribute__((weak));
   void serialEvent() {}
+  volatile static unsigned char serialEvent_flag = 0;
+  #define serialEvent_implemented
 #if defined(USART_RX_vect)
   SIGNAL(USART_RX_vect)
 #elif defined(SIG_USART0_RECV)
@@ -108,18 +110,20 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
     #error UDR not defined
   #endif
     store_char(c, &rx_buffer);
-	serialEvent();
+    serialEvent_flag = 1;
   }
 #endif
 
 #if defined(USART1_RX_vect)
   void serialEvent1() __attribute__((weak));
   void serialEvent1() {}
+  volatile static unsigned char serialEvent1_flag = 0;
+  #define serialEvent1_implemented
   SIGNAL(USART1_RX_vect)
   {
     unsigned char c = UDR1;
     store_char(c, &rx_buffer1);
-	serialEvent1();
+    serialEvent1_flag = 1;
   }
 #elif defined(SIG_USART1_RECV)
   #error SIG_USART1_RECV
@@ -128,11 +132,13 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
 #if defined(USART2_RX_vect) && defined(UDR2)
   void serialEvent2() __attribute__((weak));
   void serialEvent2() {}
+  volatile static unsigned char serialEvent2_flag = 0;
+  #define serialEvent2_implemented
   SIGNAL(USART2_RX_vect)
   {
     unsigned char c = UDR2;
     store_char(c, &rx_buffer2);
-	serialEvent2();
+    serialEvent2_flag = 1;
   }
 #elif defined(SIG_USART2_RECV)
   #error SIG_USART2_RECV
@@ -141,16 +147,55 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
 #if defined(USART3_RX_vect) && defined(UDR3)
   void serialEvent3() __attribute__((weak));
   void serialEvent3() {}
+  volatile static unsigned char serialEvent3_flag = 0;
+  #define serialEvent3_implemented
   SIGNAL(USART3_RX_vect)
   {
     unsigned char c = UDR3;
     store_char(c, &rx_buffer3);
-	serialEvent3();
+    serialEvent3_flag = 1;
   }
 #elif defined(SIG_USART3_RECV)
   #error SIG_USART3_RECV
 #endif
 
+void serialEventRun(void)
+{
+  unsigned char flag, oldSREG;
+#ifdef serialEvent_implemented
+  oldSREG = SREG;
+  noInterrupts();
+  flag = serialEvent_flag;
+  serialEvent_flag = 0;
+  SREG = oldSREG;
+  if (flag) serialEvent();
+#endif
+#ifdef serialEvent1_implemented
+  oldSREG = SREG;
+  noInterrupts();
+  flag = serialEvent1_flag;
+  serialEvent1_flag = 0;
+  SREG = oldSREG;
+  if (flag) serialEvent1();
+#endif
+#ifdef serialEvent2_implemented
+  oldSREG = SREG;
+  noInterrupts();
+  flag = serialEvent2_flag;
+  serialEvent2_flag = 0;
+  SREG = oldSREG;
+  if (flag) serialEvent2();
+#endif
+#ifdef serialEvent3_implemented
+  oldSREG = SREG;
+  noInterrupts();
+  flag = serialEvent3_flag;
+  serialEvent3_flag = 0;
+  SREG = oldSREG;
+  if (flag) serialEvent3();
+#endif
+}
+
 
 #if !defined(UART0_UDRE_vect) && !defined(UART_UDRE_vect) && !defined(USART0_UDRE_vect) && !defined(USART_UDRE_vect)
   #error Don't know what the Data Register Empty vector is called for the first UART
diff --git a/arduino/cores/arduino/HardwareSerial.h b/arduino/cores/arduino/HardwareSerial.h
index 1895f08..cbb0e5e 100644
--- a/arduino/cores/arduino/HardwareSerial.h
+++ b/arduino/cores/arduino/HardwareSerial.h
@@ -74,4 +74,6 @@ class HardwareSerial : public Stream
   extern HardwareSerial Serial3;
 #endif
 
+extern void serialEventRun(void);
+
 #endif
diff --git a/arduino/cores/arduino/main.cpp b/arduino/cores/arduino/main.cpp
index 3c46f1e..1c2ea9a 100755
--- a/arduino/cores/arduino/main.cpp
+++ b/arduino/cores/arduino/main.cpp
@@ -7,8 +7,10 @@ int main(void)
 
 	setup();
     
-	for (;;)
+	for (;;) {
 		loop();
+		serialEventRun();
+	}
         
 	return 0;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]