Skip to content

Commit 75e7b86

Browse files
committed
Various compile time improvements
Things done so far added Link Time Optimisation menu to the Digispark boards. LTO seems to work and saves a few hundred bytes over standard builds. Not all avr-gcc packages are built with the LTO module so you may get an error if your build does not support it. Seek and ye shall find a better build! Added a create disassembly recipe to the platform.txt to let us get an idea what's going on under the hood in assembly language. Added option to burn fuses using an ISP and the burn bootloader option current fuses do NOT disable the RST pin to gain a PB5 GPIO pin as that complicates life if one wants to build using an ISP instead of micronucleus bootloader. Since we by default run at 16.5MHz I set BOD to 4.3V not the default 2.7V which is probably too low a voltage to run the ATTINY85 at 16.5MHz clock.
1 parent 111396f commit 75e7b86

File tree

2 files changed

+108
-8
lines changed

2 files changed

+108
-8
lines changed

digistump-avr/boards.txt

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,42 @@
11
# See: http://code.google.com/p/arduino/wiki/Platforms
2+
# Added Link Time OPtimisation 2019
23

34
menu.cpu=Processor
4-
5+
menu.LTO=LTO (1.6.11+ only)
6+
menu.clock=Clock Speed
57
##############################################################
68

79

8-
9-
1010
digispark-tiny.name=Digispark (Default - 16.5mhz)
1111
digispark-tiny.upload.using=micronucleusprog
1212
digispark-tiny.upload.protocol=usb
1313
digispark-tiny.upload.tool=micronucleus
1414
digispark-tiny.upload.maximum_size=6012
15+
digispark-tiny.bootloader.tool=avrdude
16+
digispark-tiny.bootloader.unlock_bits=0xFF
17+
digispark-tiny.bootloader.lock_bits=0xFF
18+
digispark-tiny.bootloader.file=empty/empty_all.hex
19+
# efuse bit 0 /allow self program
20+
digispark-tiny.bootloader.extended_fuses=0xFE
21+
digispark-tiny.bootloader.high_fuses=0b11010100
22+
#digispark-tiny.menu.clock.16pll=16 MHz (PLL)
23+
digispark-tiny.bootloader.low_fuses=0xC1
24+
#digispark-tiny.menu.clock.16pll.build.f_cpu=16000000L
1525
digispark-tiny.build.mcu=attiny85
1626
digispark-tiny.build.f_cpu=16500000L
1727
digispark-tiny.build.board=AVR_DIGISPARK
1828
digispark-tiny.build.core=tiny
1929
digispark-tiny.build.variant=digispark
30+
digispark-tiny.menu.LTO.disable=Disabled
31+
digispark-tiny.menu.LTO.disable.ltocflags=
32+
digispark-tiny.menu.LTO.disable.ltoelfflags=
33+
digispark-tiny.menu.LTO.disable.ltocppflags=
34+
digispark-tiny.menu.LTO.disable.ltoarcmd=
35+
digispark-tiny.menu.LTO.enable=Enabled
36+
digispark-tiny.menu.LTO.enable.ltocflags=-flto -fno-fat-lto-objects
37+
digispark-tiny.menu.LTO.enable.ltoelfflags=-g -flto -fuse-linker-plugin
38+
digispark-tiny.menu.LTO.enable.ltocppflags=-flto
39+
digispark-tiny.menu.LTO.enable.ltoarcmd=gcc-
2040
digispark-tiny.upload.wait_for_upload_port = false
2141
digispark-tiny.upload.use_1200bps_touch = false
2242
digispark-tiny.upload.disable_flushing = false
@@ -32,6 +52,16 @@ digispark-pro.build.f_cpu=16000000L
3252
digispark-pro.build.board=AVR_DIGISPARKPRO
3353
digispark-pro.build.core=pro
3454
digispark-pro.build.variant=pro
55+
digispark-pro.menu.LTO.disable=Disabled
56+
digispark-pro.menu.LTO.disable.ltocflags=
57+
digispark-pro.menu.LTO.disable.ltoelfflags=
58+
digispark-pro.menu.LTO.disable.ltocppflags=
59+
digispark-pro.menu.LTO.disable.ltoarcmd=
60+
digispark-pro.menu.LTO.enable=Enabled
61+
digispark-pro.menu.LTO.enable.ltocflags=-flto -fno-fat-lto-objects
62+
digispark-pro.menu.LTO.enable.ltoelfflags=-g -flto -fuse-linker-plugin
63+
digispark-pro.menu.LTO.enable.ltocppflags=-flto
64+
digispark-pro.menu.LTO.enable.ltoarcmd=gcc-
3565
digispark-pro.upload.wait_for_upload_port = false
3666
digispark-pro.upload.use_1200bps_touch = false
3767
digispark-pro.upload.disable_flushing = false
@@ -46,6 +76,16 @@ digispark-pro32.build.f_cpu=16000000L
4676
digispark-pro32.build.board=AVR_DIGISPARKPRO
4777
digispark-pro32.build.core=pro
4878
digispark-pro32.build.variant=pro32buffer
79+
digispark-pro32.menu.LTO.disable=Disabled
80+
digispark-pro32.menu.LTO.disable.ltocflags=
81+
digispark-pro32.menu.LTO.disable.ltoelfflags=
82+
digispark-pro32.menu.LTO.disable.ltocppflags=
83+
digispark-pro32.menu.LTO.disable.ltoarcmd=
84+
digispark-pro32.menu.LTO.enable=Enabled
85+
digispark-pro32.menu.LTO.enable.ltocflags=-flto -fno-fat-lto-objects
86+
digispark-pro32.menu.LTO.enable.ltoelfflags=-g -flto -fuse-linker-plugin
87+
digispark-pro32.menu.LTO.enable.ltocppflags=-flto
88+
digispark-pro32.menu.LTO.enable.ltoarcmd=gcc-
4989
digispark-pro32.upload.wait_for_upload_port = false
5090
digispark-pro32.upload.use_1200bps_touch = false
5191
digispark-pro32.upload.disable_flushing = false
@@ -60,6 +100,16 @@ digispark-pro64.build.f_cpu=16000000L
60100
digispark-pro64.build.board=AVR_DIGISPARKPRO
61101
digispark-pro64.build.core=pro
62102
digispark-pro64.build.variant=pro64buffer
103+
digispark-pro64.menu.LTO.disable=Disabled
104+
digispark-pro64.menu.LTO.disable.ltocflags=
105+
digispark-pro64.menu.LTO.disable.ltoelfflags=
106+
digispark-pro64.menu.LTO.disable.ltocppflags=
107+
digispark-pro64.menu.LTO.disable.ltoarcmd=
108+
digispark-pro64.menu.LTO.enable=Enabled
109+
digispark-pro64.menu.LTO.enable.ltocflags=-flto -fno-fat-lto-objects
110+
digispark-pro64.menu.LTO.enable.ltoelfflags=-g -flto -fuse-linker-plugin
111+
digispark-pro64.menu.LTO.enable.ltocppflags=-flto
112+
digispark-pro64.menu.LTO.enable.ltoarcmd=gcc-
63113
digispark-pro64.upload.wait_for_upload_port = false
64114
digispark-pro64.upload.use_1200bps_touch = false
65115
digispark-pro64.upload.disable_flushing = false
@@ -74,6 +124,16 @@ digispark-tiny16.build.f_cpu=16000000L
74124
digispark-tiny16.build.board=AVR_DIGISPARK
75125
digispark-tiny16.build.core=tiny
76126
digispark-tiny16.build.variant=digispark
127+
digispark-tiny16.menu.LTO.disable=Disabled
128+
digispark-tiny16.menu.LTO.disable.ltocflags=
129+
digispark-tiny16.menu.LTO.disable.ltoelfflags=
130+
digispark-tiny16.menu.LTO.disable.ltocppflags=
131+
digispark-tiny16.menu.LTO.disable.ltoarcmd=
132+
digispark-tiny16.menu.LTO.enable=Enabled
133+
digispark-tiny16.menu.LTO.enable.ltocflags=-flto -fno-fat-lto-objects
134+
digispark-tiny16.menu.LTO.enable.ltoelfflags=-g -flto -fuse-linker-plugin
135+
digispark-tiny16.menu.LTO.enable.ltocppflags=-flto
136+
digispark-tiny16.menu.LTO.enable.ltoarcmd=gcc-
77137
digispark-tiny16.upload.wait_for_upload_port = false
78138
digispark-tiny16.upload.use_1200bps_touch = false
79139
digispark-tiny16.upload.disable_flushing = false
@@ -88,6 +148,16 @@ digispark-tiny8.build.f_cpu=8000000L
88148
digispark-tiny8.build.board=AVR_DIGISPARK
89149
digispark-tiny8.build.core=tiny
90150
digispark-tiny8.build.variant=digispark
151+
digispark-tiny8.menu.LTO.disable=Disabled
152+
digispark-tiny8.menu.LTO.disable.ltocflags=
153+
digispark-tiny8.menu.LTO.disable.ltoelfflags=
154+
digispark-tiny8.menu.LTO.disable.ltocppflags=
155+
digispark-tiny8.menu.LTO.disable.ltoarcmd=
156+
digispark-tiny8.menu.LTO.enable=Enabled
157+
digispark-tiny8.menu.LTO.enable.ltocflags=-flto -Fno-fat-lto-objects
158+
digispark-tiny8.menu.LTO.enable.ltoelfflags=-g -Flto -Fuse-linker-plugin
159+
digispark-tiny8.menu.LTO.enable.ltocppflags=-flto
160+
digispark-tiny8.menu.LTO.enable.ltoarcmd=gcc-
91161
digispark-tiny8.upload.wait_for_upload_port = false
92162
digispark-tiny8.upload.use_1200bps_touch = false
93163
digispark-tiny8.upload.disable_flushing = false
@@ -102,6 +172,16 @@ digispark-tiny1.build.f_cpu=1000000L
102172
digispark-tiny1.build.board=AVR_DIGISPARK
103173
digispark-tiny1.build.core=tiny
104174
digispark-tiny1.build.variant=digispark
175+
digispark-tiny1.menu.LTO.disable=Disabled
176+
digispark-tiny1.menu.LTO.disable.ltocflags=
177+
digispark-tiny1.menu.LTO.disable.ltoelfflags=
178+
digispark-tiny1.menu.LTO.disable.ltocppflags=
179+
digispark-tiny1.menu.LTO.disable.ltoarcmd=
180+
digispark-tiny1.menu.LTO.enable=Enabled
181+
digispark-tiny1.menu.LTO.enable.ltocflags=-flto -Fno-fat-lto-objects
182+
digispark-tiny1.menu.LTO.enable.ltoelfflags=-g -Flto -Fuse-linker-plugin
183+
digispark-tiny1.menu.LTO.enable.ltocppflags=-flto
184+
digispark-tiny1.menu.LTO.enable.ltoarcmd=gcc-
105185
digispark-tiny1.upload.wait_for_upload_port = false
106186
digispark-tiny1.upload.use_1200bps_touch = false
107187
digispark-tiny1.upload.disable_flushing = false

digistump-avr/platform.txt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
# For more info:
66
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
7+
# 2019 Added Link Time Optimisation possibility may require a newer more complete compiler
8+
# 2019 Added dissasembly output so we can debug / better optimise code and memory use
9+
710

811
name=Digistump AVR Boards
912
version=1.5.4
@@ -14,16 +17,18 @@ version=1.5.4
1417
# Default "compiler.path" is correct, change only if you want to overidde the initial value
1518
compiler.path={runtime.tools.avr-gcc.path}/bin/
1619
compiler.c.cmd=avr-gcc
17-
compiler.c.flags=-c -g -Os -w -ffunction-sections -fdata-sections -MMD
18-
compiler.c.elf.flags=-Os -Wl,--gc-sections
20+
compiler.c.flags=-c -g -Os -w -ffunction-sections -fdata-sections -MMD {ltocflags}
21+
compiler.c.elf.flags=-Os {ltoelfflags} -Wl,--gc-sections
1922
compiler.c.elf.cmd=avr-gcc
20-
compiler.S.flags=-c -g -x assembler-with-cpp
23+
compiler.S.flags=-c -g -x assembler-with-cpp {ltocppflags}
2124
compiler.cpp.cmd=avr-g++
22-
compiler.cpp.flags=-c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD
23-
compiler.ar.cmd=avr-ar
25+
compiler.cpp.flags=-c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD {ltocppflags}
26+
compiler.ar.cmd=avr-{ltoarcmd}ar
2427
compiler.ar.flags=rcs
2528
compiler.objcopy.cmd=avr-objcopy
2629
compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0
30+
compiler.objdump.cmd=avr-objdump
31+
compiler.objdump.flags=--disassemble --source --line-numbers --demangle --section=.text
2732
compiler.elf2hex.flags=-O ihex -R .eeprom
2833
compiler.elf2hex.cmd=avr-objcopy
2934
compiler.ldflags=
@@ -54,6 +59,8 @@ recipe.objcopy.eep.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.obj
5459

5560
## Create hex
5661
recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
62+
## Save disassembler listing
63+
recipe.hooks.objcopy.postobjcopy.1.pattern.windows=cmd /C "{compiler.path}{compiler.objdump.cmd}" {compiler.objdump.flags} "{build.path}/{build.project_name}.elf" > "{build.path}/{build.project_name}.lst"
5764

5865
## Save hex
5966
recipe.output.tmp_file={build.project_name}.hex
@@ -77,6 +84,19 @@ tools.micronucleus.upload.params.verbose=
7784
tools.micronucleus.upload.params.quiet=
7885
#tools.micronucleus.upload.pattern="{cmd.path}" --run --timeout 60 "{build.path}/{build.project_name}.hex"
7986
tools.micronucleus.upload.pattern="{cmd.path}" -cdigispark --timeout 60 -Uflash:w:{build.path}/{build.project_name}.hex:i
87+
88+
tools.avrdude.path={runtime.tools.avrdude.path}
89+
tools.avrdude.cmd.path={path}/bin/avrdude
90+
tools.avrdude.config.path={runtime.platform.path}/avrdude.conf
91+
92+
tools.avrdude.erase.params.verbose=-v
93+
tools.avrdude.erase.params.quiet=-q -q
94+
tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m
95+
96+
tools.avrdude.bootloader.params.verbose=-v
97+
tools.avrdude.bootloader.params.quiet=-q -q
98+
tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i"
99+
80100

81101
# USB Default Flags
82102
# Default blank usb manufacturer will be filled it at compile time

0 commit comments

Comments
 (0)