nm: кто занял весь флэш?

Если хочется узнать какой код занимает больше всего флэша в микроконтроллере, стоит воспользоваться утилитой nm. Параметр radix задаёт формат отображения чисел. Десятичный удобен для понимания размера, но портит адреса. Пример цели size для make:

size:
    $(PREFIX)nm --print-size --size-sort --radix=d $(BUILD_DIR)/$(TARGET).elf

Таким образом можно узнать, что функция HAL_RCC_OscConfig занимает больше килобайта!

arm-none-eabi-nm --print-size --size-sort --radix=d ./build/target.elf
....
134218896 00001100 T HAL_RCC_OscConfig

Для некоторых случаев можно сократить этот размер закомментировав настройку ненужных источников тактирования. Странно, что это не делается автоматически для источников, отсутствующих в данном МК.

О сколько нам открытий чудных…

Узнал как инициализировать массив в Си несколькими повторяющимися значениями:

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Поддерживается только GCC. Источник: https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

На той же странице есть интересное замечание про инициализацию union из int и float — если явно инициализировать float целочисленной константой, то она будет преобразована к float. Если же привести целое к union, то оно останется целым.