Главная Tuesday, January 17 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
лента новостей сайта microsin.ru лента новостей
map.gif карта сайта
нашли опечатку?

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

Поделиться:
Кто он-лайн
Сейчас на сайте:
Гостей - 3
Модуль рекламы
Поисковые системы

"Нечестные" методы оптимизации программы по размеру кода в среде AVRStudio + GCC Версия для печати
Написал microsin   
08.07.2010

Иногда надо кровь из носу получить лишние несколько байт, если код программы для 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. Совсем нечестный метод - выбор другого, "неродного" для AVRStudio компилятора. Очень хорош в этом отношении компилятор 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.

Последнее обновление ( 10.11.2011 )
 

Комментарии  

  1. #4 Levas
    2011-10-0114:22:42 Пункт первый: 12 байт… не 36.
    gcc version 4.3.3 (WinAVR 20100110).
    ATTINY2313… проект с USB, напряжонка с памятью…
  2. #3 BOFH
    2010-12-2418:26:47 IAR еще и денег стоит, так что хватит на целый вагон AVRок с достаточным размером флеша
  3. #2 Павел
    2010-12-2015:04:38 вместо кэйсов можно использовать динамическую адресацию
  4. #1 Alex312
    2010-10-1318:18:26 Да, использование iccavr.exe - действительно нечестно по отношению к GCC

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

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

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

< Пред.   След. >

Top of Page
 
microsin © 2017