mirror of
https://github.com/arduino/Arduino.git
synced 2025-01-30 19:52:13 +01:00
Optimize SoftwareSerial::recv
Similar to SoftwareSerial::write, this rewrites the loop to only touch the MSB and then shift those bits up, allowing the compiler to generate more efficient code. Unlike the write function however, it is not needed to put all instance variables used into local variables, for some reason the compiler already does this (and doing it manually even makes the code bigger). On the Arduino Uno using gcc 4.3 this saves 26 bytes. Using gcc 4.8 this saves 30 bytes. Note that this removes the else clause in the code, making the C code unbalanced, which looks like it breaks timing balance. However, looking at the code generated by the compiler, it turns out that the old code was actually unbalanced, while the new code is properly balanced.
This commit is contained in:
parent
764f24266e
commit
87f89f6100
@ -242,15 +242,13 @@ void SoftwareSerial::recv()
|
|||||||
DebugPulse(_DEBUG_PIN2, 1);
|
DebugPulse(_DEBUG_PIN2, 1);
|
||||||
|
|
||||||
// Read each of the 8 bits
|
// Read each of the 8 bits
|
||||||
for (uint8_t i=0x1; i; i <<= 1)
|
for (uint8_t i=8; i > 0; --i)
|
||||||
{
|
{
|
||||||
tunedDelay(_rx_delay_intrabit);
|
tunedDelay(_rx_delay_intrabit);
|
||||||
|
d >>= 1;
|
||||||
DebugPulse(_DEBUG_PIN2, 1);
|
DebugPulse(_DEBUG_PIN2, 1);
|
||||||
uint8_t noti = ~i;
|
|
||||||
if (rx_pin_read())
|
if (rx_pin_read())
|
||||||
d |= i;
|
d |= 0x80;
|
||||||
else // else clause added to ensure function timing is ~balanced
|
|
||||||
d &= noti;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip the stop bit
|
// skip the stop bit
|
||||||
|
Loading…
x
Reference in New Issue
Block a user