From 416198a03b3517a76a6267680b42f8cf12b5c551 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 22 Apr 2014 16:30:13 +0200 Subject: [PATCH] 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). --- .../SoftwareSerial/SoftwareSerial.cpp | 33 ++++++------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp b/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp index 0e70cb7fd..da9af3063 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/hardware/arduino/avr/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);