реклама на сайте
подробности

 
 
> gcc для AVR, слишком большой код
609
сообщение Oct 5 2010, 06:41
Сообщение #1





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
609
сообщение Oct 5 2010, 07:24
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 10-08-10
Пользователь №: 58 849



Компилирую при помощи WinAVR-20081205, прикрученном к AVR Studio 4.16.

Цитата
При неявном использовании функции они считается возвращающей int, а когда компилятор дошел до ее определения, она оказалась void


Про это я читал. Пробовал вместо void ставить int, но ситуация не меняется.

Если точно, то с закомментированной строчкой получается 220 байт, а если я ее раскомментирую, то 364. Не могли бы Вы сказать, какой конкретно версией gcc пользуетесь.
Go to the top of the page
 
+Quote Post
777777
сообщение Oct 5 2010, 07:30
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(609 @ Oct 5 2010, 11:24) *
Компилирую при помощи WinAVR-20081205, прикрученном к AVR Studio 4.16.

Про это я читал. Пробовал вместо void ставить int, но ситуация не меняется.

Если точно, то с закомментированной строчкой получается 220 байт, а если я ее раскомментирую, то 364. Не могли бы Вы сказать, какой конкретно версией gcc пользуетесь.


4.18 b700 WinAVR 20100110
Еще имеет значение чип, я выбрал ATmega168
Go to the top of the page
 
+Quote Post
609
сообщение Oct 5 2010, 08:26
Сообщение #4





Группа: Новичок
Сообщений: 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) *
Вот еще один путь снижения объема кода


Вопрос не в том как сделать код задержки меньше, а почему при объявлении функции код увеличивается?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 5 2010, 08:35
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(609 @ Oct 5 2010, 12:26) *
Вопрос не в том как сделать код задержки меньше, а почему при объявлении функции код увеличивается?

Посмотрите листинги для каждого случая, возможно, станет более понятно.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 07:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016