Spoiler: gcc version 4.8.1 (AVR_8_bit_GNU_Toolchain_3.4.3_1072) beat every other version I tested both in terms of smallest binary size, and fastest code execution.
Here are the results:
Code: Select all
gcc version 4.9.2 (AVR_8_bit_GNU_Toolchain_3.5.0_1662)
AVR Memory Usage
Program: 57888 bytes (88.3% Full)
Data: 3567 bytes (87.1% Full)
Cycles Per Frame
Min: 8234
Max: 8797
Average: 8628.83
Code: Select all
gcc version 4.8.1 (AVR_8_bit_GNU_Toolchain_3.4.3_1072)
AVR Memory Usage
Program: 57030 bytes (87.0% Full)
Data: 3561 bytes (86.9% Full)
Cycles Per Frame
Min: 7910
Max: 8439
Average: 8007.99
Code: Select all
gcc version 4.7.2 (AVR_8_bit_GNU_Toolchain_3.4.2_939)
AVR Memory Usage
Program: 57344 bytes (87.5% Full)
Data: 3563 bytes (87.0% Full)
Cycles Per Frame
Min: 8083
Max: 8632
Average: 8318.91
Code: Select all
gcc version 4.6.2 (AVR_8_bit_GNU_Toolchain_3.4.1_798)
UNSUPPORTED: -mstrict-X -maccumulate-args
AVR Memory Usage
Program: 59060 bytes (90.1% Full)
Data: 3563 bytes (87.0% Full)
Cycles Per Frame
Min: 9621
Max: 9951
Average: 9753.9
Code: Select all
gcc version 4.5.1 (AVR_8_bit_GNU_Toolchain_3.2.3_314)
UNSUPPORTED: -mstrict-X -maccumulate-args
AVR Memory Usage
Program: 59486 bytes (90.8% Full)
Data: 3565 bytes (87.0% Full)
Cycles Per Frame
Min: 9095
Max: 9396
Average: 9215.11
The resulting binary that avr-gcc 4.8.1 produces is small enough that I was able to switch my Makefile optimizations from using a mixture of -Os and -O2, to a mixture of -O2 and -O3 to shave off even more cycles per frame, resulting in:
Code: Select all
Cycles Per Frame (with -O2 and -O3 optimizations)
Min: 7871
Max: 8151
Average: 7965.3