Программирование AVR "Нечестные" методы оптимизации программы по размеру кода в среде AVR Studio + GCC Mon, August 21 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


"Нечестные" методы оптимизации программы по размеру кода в среде 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.

 

Комментарии  

 
0 #4 Levas 01.10.2011 17:22
Пункт первый: 12 байт... не 36.
gcc version 4.3.3 (WinAVR 20100110).
ATTINY2313... проект с USB, напряжонка с памятью... :lol:
Цитировать
 
 
0 #3 BOFH 24.12.2010 21:26
IAR еще и денег стоит, так что хватит на целый вагон AVRок с достаточным размером флеша :lol:
Цитировать
 
 
0 #2 Павел 20.12.2010 18:04
вместо кэйсов можно использовать динамическую адресацию
Цитировать
 
 
0 #1 Alex312 13.10.2010 21:18
Да, использование iccavr.exe - действительно нечестно по отношению к GCC :lol:
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page