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

 
 
> 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
Ответов
dimka76
сообщение Oct 5 2010, 07:53
Сообщение #2


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Не понятно для чего вы используете volatile для локальной переменной. Если без volatile, то тогда компилятор скорее всего разместит ее в регистре.

Вот еще один путь снижения объема кода

Код
void delay_ms(int time)
{
    int Timer1 = 51;

    while(time--)
       while(Timer1--)
           WDR;
}


Здесь переменная Timer вообще не нужна.
Операция сравнения с нулем выполняется быстрее, чем с каким-либо другим числом.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 5 2010, 08:14
Сообщение #3


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

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



Цитата(dimka76 @ Oct 5 2010, 11:53) *
Код
void delay_ms(int time)
{
    int Timer1 = 51;

    while(time--)
       while(Timer1--)
           WDR;
}

Не знаю как себя поведёт avr-gcc, но в аннотации к mspgcc про такую конструкцию написано, что при удачном стечении обстоятельств ждать будем вечно...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Oct 5 2010, 10:39
Сообщение #4


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(MrYuran @ Oct 5 2010, 12:14) *
Не знаю как себя поведёт avr-gcc, но в аннотации к mspgcc про такую конструкцию написано, что при удачном стечении обстоятельств ждать будем вечно...


А там случайно эти обстоятельства не конкретизируются?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 5 2010, 11:10
Сообщение #5


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

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



Цитата(dimka76 @ Oct 5 2010, 14:39) *
А там случайно эти обстоятельства не конкретизируются?


Цитата
18. If you execute
while ((long) a & 0x80000l);
the program will hang, unless ’a’ is declared volatile. So, do it!


Цитата
19. Delay loops are very sophisticated routines. Normally, users do something like:
int i = 1234;
while (i--);
or
int i;
for (i = 0; i < 1234; i++);
NEITHER WILL WORK AS YOU EXPECT when optimisation is switched on!!! The optimizer will detect
dead code in both examples and will eliminate it. It might even eliminate the loop completely. Adding the
volatile attribute to the definition of ’i’ might help, but don’t count on it if ’i’ is a local variable. The
compiler can still detect the calculations are wasteful, and eliminate them.
Regardless of these optimisation issues, this type of delay loop is poor programming style - you have no
idea how long or short a delay it might produce (although there is an obvious minimum bound!). It would be
better, and more reliable to define something like:
static void __inline__ brief_pause(register unsigned int n)
{
__asm__ __volatile__ (
"1: \n"
" dec %[n] \n"
" jne 1b \n"
: [n] "+r"(n));
}
and call this routine where needed. This is simple, compact, and predictable.

Хотя, я пробовал - иногда прокатывало...
Но тут уж как повезёт.

Основной смысл последней цитаты - задержку лучше определить самому (с точностью до такта), чем отдавать на откуп компилятору


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


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MrYuran @ Oct 5 2010, 15:10) *
Цитата
Не знаю как себя поведёт avr-gcc, но в аннотации к mspgcc про такую конструкцию написано, что при удачном стечении обстоятельств ждать будем вечно...
Цитата
А там случайно эти обстоятельства не конкретизируются?

...
Вывод неправильный - не 'ждать вечно', а 'не ждать вообще'

Цитата
Основной смысл последней цитаты - задержку лучше определить самому (с точностью до такта), чем отдавать на откуп компилятору
Это да, тут поспорить трудно (хотя и можно при большом желании и абсолютном взаимопонимании с компилятором) rolleyes.gif
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   Компилирую при помощи WinAVR-20081205, прикрученно...   Oct 5 2010, 07:24
|- - 777777   Цитата(609 @ Oct 5 2010, 11:24) Компилиру...   Oct 5 2010, 07:30
|- - 609   Цитата(777777 @ Oct 5 2010, 11:30) 4.18 b...   Oct 5 2010, 08:26
|- - MrYuran   Цитата(609 @ Oct 5 2010, 12:26) Вопрос не...   Oct 5 2010, 08:35
|- - Сергей Борщ   Цитата(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
- - 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 Текстовая версия Сейчас: 29th July 2025 - 16:26
Рейтинг@Mail.ru


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