From b1681fb6a11e6eb286bc93af3bcc59422e054eb8 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Fri, 22 Apr 2022 10:13:31 +0200 Subject: [PATCH] [Core] Allow usage of AVRs minimal printf library (#16266) Co-authored-by: Sergey Vlasov --- docs/squeezing_avr.md | 13 +++++++++++++ platforms/avr/platform.mk | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/docs/squeezing_avr.md b/docs/squeezing_avr.md index 62f0a5d2903247598a21f90446753f666b632b7b..f7e21d932becaafee73a090695c09ef5a37f6b77 100644 --- a/docs/squeezing_avr.md +++ b/docs/squeezing_avr.md @@ -30,6 +30,19 @@ MAGIC_ENABLE = no These features are enabled by default, but may not be needed. Double check to make sure, though. Largest in size is "magic" -- the QMK magic keycodes -- which control things like NKRO toggling, GUI and ALT/CTRL swapping, etc. Disabling it will disable those functions. +If you use `sprintf` or `snprintf` functions you can save around ~400 Bytes by enabling this option. +```make +AVR_USE_MINIMAL_PRINTF = yes +``` + +This will include smaller implementations from AVRs libc into your Firmware. They are [not fully featured](https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1), for instance zero padding and field width specifiers are not supported. So if you use `sprintf` or `snprintf` like this: +```c +sprintf(wpm_str, "%03d", get_current_wpm()); +snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c"); +``` + +you will still need the standard implementation. + ## `config.h` Settings If you've done all of that, and you don't want to disable features like RGB, Audio, OLEDs, etc, there are some additional options that you can add to your config.h that can help. diff --git a/platforms/avr/platform.mk b/platforms/avr/platform.mk index 9f304d2e209d7969359033a72ff53ce126bf8a45..0374e2e05815b1e3254113a24f1cdc43b1643b9e 100644 --- a/platforms/avr/platform.mk +++ b/platforms/avr/platform.mk @@ -37,6 +37,15 @@ CXXFLAGS += -fno-exceptions -std=c++11 LDFLAGS += -Wl,--gc-sections +# Use AVR's libc minimal printf implementation which has less features +# and thus can shave ~400 bytes. Usually we use the xprintf +# implementation but keyboards that use s(n)printf automatically +# pull in the AVR libc implementation, which is ~900 bytes heavy. +AVR_USE_MINIMAL_PRINTF ?= no +ifeq ($(strip $(AVR_USE_MINIMAL_PRINTF)), yes) + LDFLAGS += -Wl,--whole-archive -lprintf_min -Wl,--no-whole-archive +endif + OPT_DEFS += -DF_CPU=$(F_CPU)UL MCUFLAGS = -mmcu=$(MCU)