diff options
author | Matthijs Kooijman <matthijs@stdin.nl> | 2014-04-22 16:30:13 +0200 |
---|---|---|
committer | Matthijs Kooijman <matthijs@stdin.nl> | 2015-01-26 17:03:25 +0100 |
commit | ddcdc901a7b5eb9504f4fb3debf16e985e734b5f (patch) | |
tree | 80d1b2660e974ef81344d4625d61306c205413a6 | |
parent | cf0cc48d9a8de84fabb44e644dcac6a3f8afc66c (diff) |
Simplify SoftwareSerial::write
Before, there was nearly identical code for the inverted and regular
cases. However, simply inverting the byte in the inverted case allows
using the regular code twice, reducing the generated code size by 100
bytes (on an Arduino Uno and gcc 4.3, on gcc 4.8 the reduction is 50
bytes).
-rw-r--r-- | libraries/SoftwareSerial/SoftwareSerial.cpp | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp index 0e70cb7..da9af30 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -486,34 +486,21 @@ size_t SoftwareSerial::write(uint8_t b) // Write each of the 8 bits
if (_inverse_logic)
- {
- for (byte mask = 0x01; mask; mask <<= 1)
- {
- if (b & mask) // choose bit
- tx_pin_write(LOW); // send 1
- else
- tx_pin_write(HIGH); // send 0
-
- tunedDelay(_tx_delay);
- }
+ b = ~b;
- tx_pin_write(LOW); // restore pin to natural state
- }
- else
+ for (byte mask = 0x01; mask; mask <<= 1)
{
- for (byte mask = 0x01; mask; mask <<= 1)
- {
- if (b & mask) // choose bit
- tx_pin_write(HIGH); // send 1
- else
- tx_pin_write(LOW); // send 0
-
- tunedDelay(_tx_delay);
- }
+ if (b & mask) // choose bit
+ tx_pin_write(HIGH); // send 1
+ else
+ tx_pin_write(LOW); // send 0
- tx_pin_write(HIGH); // restore pin to natural state
+ tunedDelay(_tx_delay);
}
+ // restore pin to natural state
+ tx_pin_write(_inverse_logic ? LOW : HIGH);
+
SREG = oldSREG; // turn interrupts back on
tunedDelay(_tx_delay);
|