ArduinoCore-avr/cores/arduino
Matthijs Kooijman 3babfc2a85 Use constants for register bit positions in HardwareSerial
Previously, the constants to use for the bit positions of the various
UARTs were passed to the HardwareSerial constructor. However, this
meant that whenever these values were used, the had to be indirectly
loaded, resulting in extra code overhead. Additionally, since there is
no instruction to shift a value by a variable amount, the 1 << x
expressions (inside _BV and sbi() / cbi()) would be compiled as a loop
instead of being evaluated at compiletime.

Now, the HardwareSerial class always uses the constants for the bit
positions of UART 0 (and some code is present to make sure these
constants exist, even for targets that only have a single unnumbered
UART or start at UART1).

This was already done for the TXC0 constant, for some reason. For the
actual register addresses, this approach does not work, since these are
of course different between the different UARTs on a single chip.

Of course, always using the UART 0 constants is only correct when the
constants are actually identical for the different UARTs. It has been
verified that this is currently the case for all targets supported by
avr-gcc 4.7.2, and the code contains compile-time checks to verify this
for the current target, in case a new target is added for which this
does not hold. This verification was done using:

for i in TXC RXEN TXEN RXCIE UDRIE U2X UPE; do echo $i; grep --no-filename -r "#define $i[0-9]\? " /usr/lib/avr/include/avr/io* | sed "s/#define $i[0-9]\?\s*\(\S\)\+\s*\(\/\*.*\*\/\)\?$/\1/" | sort | uniq ; done

This command shows that the above constants are identical for all uarts
on all platforms, except for TXC, which is sometimes 6 and sometimes 0.
Further investigation shows that it is always 6, except in io90scr100.h,
but that file defines TXC0 with value 6 for the UART and uses TXC with
value 0 for some USB-related register.

This commit reduces program size on the uno by around 120 bytes.
2014-01-16 16:36:06 +01:00
..
avr-libc Increased malloc margin to 128. 2013-03-29 11:48:35 +01:00
Arduino.h Define a _NOP() macro 2014-01-16 16:29:41 +01:00
CDC.cpp Merge branch 'master' into ide-1.5.x 2013-09-30 16:25:10 +02:00
Client.h Making Print::write(char *) non-virtual. 2011-09-07 18:41:05 -04:00
HID.cpp fixed logic error in Keyboard.release() - now removes every occurrence of a key if it's present more than once 2012-03-28 19:46:32 -04:00
HardwareSerial.cpp Use constants for register bit positions in HardwareSerial 2014-01-16 16:36:06 +01:00
HardwareSerial.h Use constants for register bit positions in HardwareSerial 2014-01-16 16:36:06 +01:00
IPAddress.cpp Make some operators in IPAddress const 2014-01-15 16:20:48 +01:00
IPAddress.h Make some operators in IPAddress const 2014-01-15 16:20:48 +01:00
Platform.h support for non-Leonardo boards is back! 2011-08-30 11:50:08 -04:00
Print.cpp Merge branch 'cast' of github.com:Lauszus/Arduino into Lauszus-cast 2013-12-31 20:11:08 +01:00
Print.h Add Print::write(const char *, size_t) 2013-12-24 13:22:42 +01:00
Printable.h Merge branch 'new-extension' of https://github.com/arduino/Arduino 2011-08-27 23:53:42 +01:00
Server.h Making Print::write(char *) non-virtual. 2011-09-07 18:41:05 -04:00
Stream.cpp Adding readString() and readStringUntil() to Stream (Adrian McEwen). 2012-05-16 15:39:34 -04:00
Stream.h Add uint8_t* versions of methods in Stream 2013-12-24 13:22:42 +01:00
Tone.cpp fixed permissions on a lot of text files. see #1116 2012-12-10 10:42:49 +01:00
USBAPI.h Merge branch 'master' into ide-1.5.x 2013-09-30 16:25:10 +02:00
USBCore.cpp Remove hardcoded product names (all provided for in boards.txt) 2013-07-17 14:38:05 +02:00
USBCore.h Serial via USB works 2011-08-14 16:59:34 -04:00
USBDesc.h sketch USB VID and PID values are passed in from boards.txt at compile time now. changed sketch PIDs to final values. also uncommented Micro section in boards.txt 2012-04-09 08:06:35 -04:00
Udp.h Making Print::write(char *) non-virtual. 2011-09-07 18:41:05 -04:00
WCharacter.h Replacing custom String.toInt() function with a call to atol(). 2010-12-03 23:12:41 -05:00
WInterrupts.c Added support to INT6 on Leonardo. 2013-05-13 21:22:59 +02:00
WMath.cpp Improving third-party hardware support: 2009-11-21 23:23:43 +00:00
WString.cpp Improved portability of String class (maniacbug) 2014-01-01 17:22:40 +01:00
WString.h Fixed String class regression after f80c6c5f35cddcf4761a3c97feb8504425e9d27d 2013-09-03 18:40:30 +02:00
binary.h Improving third-party hardware support: 2009-11-21 23:23:43 +00:00
hooks.c Added general yield()-hook for cooperative scheduling development (part 2) 2012-11-02 18:12:21 +01:00
main.cpp renamed Leonardo USB_ class to USBDevice_ to be unambiguous. renamed "USB" object to "USBDevice" to prevent conflict with USB Host library (thanks Massimo) 2012-05-01 11:18:15 -04:00
new.cpp Add trivial new[] and delete[] operators (Justin R. Cutler) 2012-12-16 14:30:12 +01:00
new.h Add trivial new[] and delete[] operators (Justin R. Cutler) 2012-12-16 14:30:12 +01:00
wiring.c Merged 1.0.5 2013-04-03 13:51:04 +02:00
wiring_analog.c Merge branch 'issue1366' of github.com:Lauszus/Arduino into Lauszus-issue1366 2013-07-31 17:22:12 +02:00
wiring_digital.c Merge branch 'master' of github.com:arduino/Arduino into new-extension 2012-01-10 12:02:27 -05:00
wiring_private.h Merged 1.0.5 2013-05-29 18:30:36 +02:00
wiring_pulse.c fixed permissions on a lot of text files. see #1116 2012-12-10 10:42:49 +01:00
wiring_shift.c fixed permissions on a lot of text files. see #1116 2012-12-10 10:42:49 +01:00