|
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:53
|

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

|
Не понятно для чего вы используете volatile для локальной переменной. Если без volatile, то тогда компилятор скорее всего разместит ее в регистре. Вот еще один путь снижения объема кода Код void delay_ms(int time) { int Timer1 = 51;
while(time--) while(Timer1--) WDR; } Здесь переменная Timer вообще не нужна. Операция сравнения с нулем выполняется быстрее, чем с каким-либо другим числом.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Oct 5 2010, 11:10
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Oct 6 2010, 06:57
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(MrYuran @ Oct 5 2010, 15:10)  Цитата Не знаю как себя поведёт avr-gcc, но в аннотации к mspgcc про такую конструкцию написано, что при удачном стечении обстоятельств ждать будем вечно... Цитата А там случайно эти обстоятельства не конкретизируются? ... Вывод неправильный - не 'ждать вечно', а 'не ждать вообще' Цитата Основной смысл последней цитаты - задержку лучше определить самому (с точностью до такта), чем отдавать на откуп компилятору Это да, тут поспорить трудно (хотя и можно при большом желании и абсолютном взаимопонимании с компилятором)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|