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).
This commit is contained in:
Matthijs Kooijman 2014-04-22 16:30:13 +02:00
parent 6685aa999c
commit 416198a03b
1 changed files with 10 additions and 23 deletions

View File

@ -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);