В моих тестах с avr-gcc 4.3.5 он только сохраняет регистры, если не сильно оптимизирует. Нормальные уровни (-Os или -O2) приводят к оптимизации инструкций нажатия.
Далее можно указать в объявлении функции, что оно не вернется с __attribute__((noreturn))
. Также полезно провести полную оптимизацию программы с -fwhole-program.
Исходный код в avr-libc использует call для перехода к main, поскольку указано, что main может возвратиться, а затем переходит к выходу (который объявлен как noreturn и, следовательно, не генерирует вызов). Вы можете связать свой вариант, если считаете, что это слишком много. exit (), в свою очередь, просто отключает прерывания и входит в бесконечный цикл, эффективно останавливая вашу программу, но не экономя энергию. Это четыре инструкции и два байта служебной памяти стека, если ваш main () никогда не возвращается или не вызывает exit ().