xvr 12 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Не знаю как себя поведёт avr-gcc, но в аннотации к mspgcc про такую конструкцию написано, что при удачном стечении обстоятельств ждать будем вечно... А там случайно эти обстоятельства не конкретизируются? ... Вывод неправильный - не 'ждать вечно', а 'не ждать вообще' Основной смысл последней цитаты - задержку лучше определить самому (с точностью до такта), чем отдавать на откуп компиляторуЭто да, тут поспорить трудно (хотя и можно при большом желании и абсолютном взаимопонимании с компилятором) :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
609 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба 4.18 b700 WinAVR 20100110 Еще имеет значение чип, я выбрал ATmega168 Поставил эту версию, проблема исчезла, и уменьшился код: при компиляции в обоих случаях выдает 168 байт. А если напишете #define WDR asm volatile ("wdr"), то не сможет. Спасибо за подсказку, так действительно получается более оптимально. Смею предположить, что оптимизирующий компилятор в одном случае может вставлять вызов функции, а в другом -- осуществлять in-line подстановку тела этой функции в месте ее вызова. Попробуйте отключить оптимизацию и, как абсолютно правильно сказал MrYuran, посмотрите листинги. Вы не только ответите на свой вопрос, но и существенно придвинетесь в сторону профи. Листинг смотрел, там действительно в одном случае функция вызывается, а в другом подставляется. Только я так и не понял, почему компилятор подставляет 100 байт тела функции, вместо того чтобы вызвать функцию 3 байтами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Листинг смотрел, там действительно в одном случае функция вызывается, а в другом подставляется. Только я так и не понял, почему компилятор подставляет 100 байт тела функции, вместо того чтобы вызвать функцию 3 байтами. Это зависит от того, какие остальные оптимизирующие ключи выставлены и от того, сколько раз эта функция вызывается. Если один, то зачем тратить 3 байта на её вызов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
609 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Если один, то зачем тратить 3 байта на её вызов? В примере задержка вызывается два раза, и код подставляется дважды. Получается, вместо того чтобы потратить 6 байт на вызов, и 100 байт на тело функции, компилятор подставляет 200 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Вот ключи для более тонкой настройки инлайна и анролла циклов: CFLAGS += --param inline-call-cost=10 CFLAGS += --param max-unroll-times=100 #CFLAGS += -ftree-loop-ivcanon #CFLAGS += -mcall-prologues CFLAGS += -finline-small-functions CFLAGS += -fearly-inlining CFLAGS += -finline-limit=100 CFLAGS += -fno-unit-at-a-time #CFLAGS += -fno-inline-small-functions #CFLAGS += -fno-inline-functions #CFLAGS += -fno-unroll-loops #CFLAGS += -fno-unroll-all-loops Может, ещё другие есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
609 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Вот ключи для более тонкой настройки инлайна и анролла циклов: CFLAGS += --param inline-call-cost=10 CFLAGS += --param max-unroll-times=100 #CFLAGS += -ftree-loop-ivcanon #CFLAGS += -mcall-prologues CFLAGS += -finline-small-functions CFLAGS += -fearly-inlining CFLAGS += -finline-limit=100 CFLAGS += -fno-unit-at-a-time #CFLAGS += -fno-inline-small-functions #CFLAGS += -fno-inline-functions #CFLAGS += -fno-unroll-loops #CFLAGS += -fno-unroll-all-loops Может, ещё другие есть. Спасибо! Попробовал первый ключ из Вашего списка, все стало компилироваться одинаково. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться