"Нечестные" методы оптимизации программы по размеру кода в среде AVR Studio + GCC Печать
Добавил(а) microsin   

Иногда надо кровь из носу получить лишние несколько байт, если код программы для AVR не умещается во flash микроконтроллера. Про такие простые вещи, как опция -Os компилятора, компиляция в ассемблер и удаление библиотек printf я писать не буду, это и так все знают. А какие есть грязные методы оптимизации, которые позволяют с минимальными затратами получить экономию места под код?

1. Очень хороший приемчик - сделать функцию main ничего не возвращающей. Позволяет сэкономить на ненужных push и pop целых 36 байт! По умолчанию функция main обычно определена как int main (void). А мы напишем так: 

void main(void) __attribute__((__noreturn__));

void main(void)
{
  //код
  // ..

  //оператор return больше не нужен!
  //return 0;
}

2. Старые версии библиотек AVR Libc и компилятора GCC (WinAVR) могут иногда помочь в деле оптимизации размера кода. Если любите плясать с бубном, то старые версии WinAVR доступны по ссылке [1]. Если используете функции для доступа к EEPROM, не напоритесь на грабли из-за старых библиотек, см. ссылку [2].

3. Совсем нечестный метод - выбор другого, "неродного" для AVR Studio компилятора. Очень хорош в этом отношении компилятор IAR (c:\Program Files\IAR Systems\Embedded Workbench 5.3\avr\bin\iccavr.exe). Проект лучше всего оптимизировать помодульно, так как скормить компилятору iccavr.exe код от GCC может оказаться непростой задачей.

4. Часто группа if...else if... дает код меньше, чем оператор switch...case, поэтому проверьте для Вашего случая,  какой вариант кода будет эффективнее. Если нужно применить switch...case, то постарайтесь задать последовательные по значению константы проверки case (1, 2, 3...).

Если кто-нибудь знает другие полезные трюки, буду рад увидеть их в комментариях!

[Ссылки]

1. Все версии WinAVR (AVR Libc)
2Глюк при чтении EEPROM у ATmega8, ATmega32, ATmega128.
3. Методы оптимизации кода C для 8-битных AVR.
4. AVR035: эффективное кодирование на C для 8-битных AVR.