|
gcc для AVR, слишком большой код |
|
|
|
Oct 5 2010, 06:41
|
Группа: Новичок
Сообщений: 7
Регистрация: 10-08-10
Пользователь №: 58 849

|
Здравствуйте. Я программирую на языке C для микроконтроллеров AVR при помощи компилятора gcc. Нашел такую интересную особенность. В приведенном ниже коде программа занимает место порядка 200 байт. Если раскомментировать закомментированную строку с объявлением функции delay_ms, программа резко полнеет до 350 байт. Никак не могу разобраться, почему. Не могли бы вы мне помочь. Упорное чтение Кернигана и Ричи не помогает. Куда гуглить просто не знаю. Заранее спасибо за ответ. Код #define WDR asm("wdr") //void delay_ms(int time);
void main(void) { delay_ms(1); delay_ms(1); }
void delay_ms(int time) { volatile int Timer, Timer1;
for (Timer=0; Timer<time; Timer++) for (Timer1=0; Timer1<51; Timer1++) WDR; } Заодно сразу показываю опции, которые передаю компилятору. Сам ничего крамольного в них не обнаружил. Код -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
|
|
|
|
 |
Ответов
|
Oct 5 2010, 07:24
|
Группа: Новичок
Сообщений: 7
Регистрация: 10-08-10
Пользователь №: 58 849

|
Компилирую при помощи WinAVR-20081205, прикрученном к AVR Studio 4.16. Цитата При неявном использовании функции они считается возвращающей int, а когда компилятор дошел до ее определения, она оказалась void Про это я читал. Пробовал вместо void ставить int, но ситуация не меняется. Если точно, то с закомментированной строчкой получается 220 байт, а если я ее раскомментирую, то 364. Не могли бы Вы сказать, какой конкретно версией gcc пользуетесь.
|
|
|
|
|
Oct 5 2010, 08:26
|
Группа: Новичок
Сообщений: 7
Регистрация: 10-08-10
Пользователь №: 58 849

|
Цитата(777777 @ Oct 5 2010, 11:30)  4.18 b700 WinAVR 20100110 Еще имеет значение чип, я выбрал ATmega168 Спасибо! Завтра попробую скачать эту версию, посмотрю что получится. Цитата(dimka76 @ Oct 5 2010, 11:53)  Не понятно для чего вы используете volatile для локальной переменной. Если без volatile, то тогда компилятор скорее всего разместит ее в регистре. Если не использовать volatile, то компилятор может оптимизировать задержку, т.е. просто выполнить конечный результат функции. Цитата(dimka76 @ Oct 5 2010, 11:53)  Вот еще один путь снижения объема кода Вопрос не в том как сделать код задержки меньше, а почему при объявлении функции код увеличивается?
|
|
|
|
Сообщений в этой теме
609 gcc для AVR Oct 5 2010, 06:41 777777 Цитата(609 @ Oct 5 2010, 10:41) Здравству... Oct 5 2010, 06:56 609 Цитата(777777 @ Oct 5 2010, 10:56) А како... Oct 5 2010, 06:59  777777 Цитата(609 @ Oct 5 2010, 10:59) Build suc... Oct 5 2010, 07:08   Сергей Борщ Цитата(609 @ Oct 5 2010, 11:26) Если не и... Oct 5 2010, 10:23   zhevak Цитата(609 @ Oct 5 2010, 14:26) Вопрос не... Oct 5 2010, 10:50   609 Цитата(609 @ Oct 5 2010, 12:26) 4.18 b700... Oct 6 2010, 10:03    MrYuran Цитата(609 @ Oct 6 2010, 14:03) Листинг с... Oct 6 2010, 10:37     609 Цитата(MrYuran @ Oct 6 2010, 14:37) Если ... Oct 6 2010, 11:33 dimka76 Не понятно для чего вы используете volatile для ло... Oct 5 2010, 07:53 MrYuran Цитата(dimka76 @ Oct 5 2010, 11:53) Кодvo... Oct 5 2010, 08:14  dimka76 Цитата(MrYuran @ Oct 5 2010, 12:14) Не зн... Oct 5 2010, 10:39   MrYuran Цитата(dimka76 @ Oct 5 2010, 14:39) А там... Oct 5 2010, 11:10    XVR Цитата(MrYuran @ Oct 5 2010, 15:10) Цитат... Oct 6 2010, 06:57 Dx! А чем макросы _delay_ms() и _delay_us() что идут с... Oct 5 2010, 20:58 MrYuran Вот ключи для более тонкой настройки инлайна и анр... Oct 6 2010, 11:42 609 Цитата(MrYuran @ Oct 6 2010, 15:42) Вот к... Oct 6 2010, 12:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|