Changing to a simpler mental model for serialEvent (Paul Stoffregen).

http://code.google.com/p/arduino/issues/detail?id=626
This commit is contained in:
David A. Mellis 2011-09-07 17:47:17 -04:00
parent 560a510f64
commit 3c66dc1b8d
3 changed files with 6 additions and 35 deletions

View File

@ -88,7 +88,6 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#else #else
void serialEvent() __attribute__((weak)); void serialEvent() __attribute__((weak));
void serialEvent() {} void serialEvent() {}
volatile static unsigned char serialEvent_flag = 0;
#define serialEvent_implemented #define serialEvent_implemented
#if defined(USART_RX_vect) #if defined(USART_RX_vect)
SIGNAL(USART_RX_vect) SIGNAL(USART_RX_vect)
@ -110,20 +109,17 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#error UDR not defined #error UDR not defined
#endif #endif
store_char(c, &rx_buffer); store_char(c, &rx_buffer);
serialEvent_flag = 1;
} }
#endif #endif
#if defined(USART1_RX_vect) #if defined(USART1_RX_vect)
void serialEvent1() __attribute__((weak)); void serialEvent1() __attribute__((weak));
void serialEvent1() {} void serialEvent1() {}
volatile static unsigned char serialEvent1_flag = 0;
#define serialEvent1_implemented #define serialEvent1_implemented
SIGNAL(USART1_RX_vect) SIGNAL(USART1_RX_vect)
{ {
unsigned char c = UDR1; unsigned char c = UDR1;
store_char(c, &rx_buffer1); store_char(c, &rx_buffer1);
serialEvent1_flag = 1;
} }
#elif defined(SIG_USART1_RECV) #elif defined(SIG_USART1_RECV)
#error SIG_USART1_RECV #error SIG_USART1_RECV
@ -132,13 +128,11 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#if defined(USART2_RX_vect) && defined(UDR2) #if defined(USART2_RX_vect) && defined(UDR2)
void serialEvent2() __attribute__((weak)); void serialEvent2() __attribute__((weak));
void serialEvent2() {} void serialEvent2() {}
volatile static unsigned char serialEvent2_flag = 0;
#define serialEvent2_implemented #define serialEvent2_implemented
SIGNAL(USART2_RX_vect) SIGNAL(USART2_RX_vect)
{ {
unsigned char c = UDR2; unsigned char c = UDR2;
store_char(c, &rx_buffer2); store_char(c, &rx_buffer2);
serialEvent2_flag = 1;
} }
#elif defined(SIG_USART2_RECV) #elif defined(SIG_USART2_RECV)
#error SIG_USART2_RECV #error SIG_USART2_RECV
@ -147,13 +141,11 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#if defined(USART3_RX_vect) && defined(UDR3) #if defined(USART3_RX_vect) && defined(UDR3)
void serialEvent3() __attribute__((weak)); void serialEvent3() __attribute__((weak));
void serialEvent3() {} void serialEvent3() {}
volatile static unsigned char serialEvent3_flag = 0;
#define serialEvent3_implemented #define serialEvent3_implemented
SIGNAL(USART3_RX_vect) SIGNAL(USART3_RX_vect)
{ {
unsigned char c = UDR3; unsigned char c = UDR3;
store_char(c, &rx_buffer3); store_char(c, &rx_buffer3);
serialEvent3_flag = 1;
} }
#elif defined(SIG_USART3_RECV) #elif defined(SIG_USART3_RECV)
#error SIG_USART3_RECV #error SIG_USART3_RECV
@ -161,38 +153,17 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
void serialEventRun(void) void serialEventRun(void)
{ {
unsigned char flag, oldSREG;
#ifdef serialEvent_implemented #ifdef serialEvent_implemented
oldSREG = SREG; if (Serial.available()) serialEvent();
noInterrupts();
flag = serialEvent_flag;
serialEvent_flag = 0;
SREG = oldSREG;
if (flag) serialEvent();
#endif #endif
#ifdef serialEvent1_implemented #ifdef serialEvent1_implemented
oldSREG = SREG; if (Serial1.available()) serialEvent1();
noInterrupts();
flag = serialEvent1_flag;
serialEvent1_flag = 0;
SREG = oldSREG;
if (flag) serialEvent1();
#endif #endif
#ifdef serialEvent2_implemented #ifdef serialEvent2_implemented
oldSREG = SREG; if (Serial2.available()) serialEvent2();
noInterrupts();
flag = serialEvent2_flag;
serialEvent2_flag = 0;
SREG = oldSREG;
if (flag) serialEvent2();
#endif #endif
#ifdef serialEvent3_implemented #ifdef serialEvent3_implemented
oldSREG = SREG; if (Serial3.available()) serialEvent3();
noInterrupts();
flag = serialEvent3_flag;
serialEvent3_flag = 0;
SREG = oldSREG;
if (flag) serialEvent3();
#endif #endif
} }

View File

@ -74,6 +74,6 @@ class HardwareSerial : public Stream
extern HardwareSerial Serial3; extern HardwareSerial Serial3;
#endif #endif
extern void serialEventRun(void); extern void serialEventRun(void) __attribute__((weak));
#endif #endif

View File

@ -9,7 +9,7 @@ int main(void)
for (;;) { for (;;) {
loop(); loop();
serialEventRun(); if (serialEventRun) serialEventRun();
} }
return 0; return 0;