Оптимизировать микропрограмму для AVR можно разными способами. Кто-то экспериментирует c опциями компилятора, кто-то меняет сам код. Конечно, можно писать на Ассемблере, но язык Си значительно сэкономит время и не отпугнет новичка. Да и пооптимизировать "есть что".
Работая над bootloader'ом PicoBoot, Ralph Doncaster обнаружил интересную особенность для контроллеров AttinyX5.
Так, например, если ваша программа не использует прерывания, то компилятор GCC в любом случае вставляет кусок кода, который называется __ctors_end перед переходом на основную часть программы. В этом коде выставляются вектора прерываний, начальные значения регистров, а также указатель стека.
Если прерывания не используются, то установка не нужна, соответственно от этого участка кода можно избавиться, сэкономив при этом несколько десятков байт.
В случае Ральфа удалось сжать размер программы с 274 то 190 байт. Для 8 килобайт памяти ATTiny это немаленькая экономия.
Конечно, в век гигабайтов и гигагерцев это кажется неуместным, но в мире embedded счет идет на биты и такты процессора, так что статья будет очень хорошим материалом для изучения одного из подходов к оптимизации.