aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cores/arduino/HardwareSerial.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp
index 5cd89e5..75e079f 100644
--- a/cores/arduino/HardwareSerial.cpp
+++ b/cores/arduino/HardwareSerial.cpp
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
+#include <util/atomic.h>
#include "Arduino.h"
#include "HardwareSerial.h"
@@ -76,6 +77,13 @@ void serialEventRun(void)
#endif
}
+// macro to guard critical sections when needed for large TX buffer sizes
+#if (SERIAL_TX_BUFFER_SIZE>256)
+#define TX_BUFFER_ATOMIC ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+#else
+#define TX_BUFFER_ATOMIC
+#endif
+
// Actual interrupt handlers //////////////////////////////////////////////////////////////
void HardwareSerial::_tx_udr_empty_irq(void)
@@ -177,15 +185,13 @@ int HardwareSerial::read(void)
int HardwareSerial::availableForWrite(void)
{
-#if (SERIAL_TX_BUFFER_SIZE>256)
- uint8_t oldSREG = SREG;
- cli();
-#endif
- tx_buffer_index_t head = _tx_buffer_head;
- tx_buffer_index_t tail = _tx_buffer_tail;
-#if (SERIAL_TX_BUFFER_SIZE>256)
- SREG = oldSREG;
-#endif
+ tx_buffer_index_t head;
+ tx_buffer_index_t tail;
+
+ TX_BUFFER_ATOMIC {
+ head = _tx_buffer_head;
+ tail = _tx_buffer_tail;
+ }
if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
return tail - head - 1;
}