Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR 3.10C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
KSN
Вот небольшой фрагмент кода:
ktmp=0;
PultFlag=4;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;
ktmp=0;
PultFlag=5;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag>>pult)&0x01)?(1<<pult):0;
Если уровень оптимизации по скорости минимален или вооще нет, то все хорошо, но как только делаю уровень оптимизации High, то в первом цикле перестает вычисляться ktmp. Поэтому вопрос: в какой степени компилятор наплевательски относится к написанному коду при оптимизациях? Как с этим обстоят дела в более поздних версиях компилятора. Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу.
mse
Ну прально
Цитата
ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;
ktmp=0;

результата использования ktmp нет, зачем её вычислять ваще? Оптимизаццыя то по скорости! ;О) В других оптимизаццыях компилер предполагает, что это, мобуть, какая-то задержка калиброванная ;О) и не торгает. А при макс скорости он её таво...
Георгий
Только хотел ответить, уже опередили. Я тоже очень грешил на компилятор, когда начал переходить на C IAR (закрытая мною тема про повторный вызов функции), а оказывается, алгоритм надо лучше продумывать.
dxp
Цитата(KSN @ Dec 9 2005, 14:23) *
Вот небольшой фрагмент кода:
ktmp=0;
PultFlag=4;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;
ktmp=0;
PultFlag=5;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag>>pult)&0x01)?(1<<pult):0;

Дык. После первого цикла значение ktmp не используется. Более того, сразу после этого ему конкретно присваивается 0. С точки зрения компилятора и здравого смысла работа, произведенная в первом цикле сделана впустую. И оптимизатор совершенно справедливо удаляет этот ненужный код, уменьшая размер программы и увеличивая скорость ее работы. В этом весь смысл оптимизации и состоит. Если Вам надо проследить за значениями и подавить оптимизацию, то объявите ktmp как volatile. Так часто делают при отладке, когда надо отследить промежуточные значения. В этом случае компилятор не будет ничего оптимизировать в части этой переменной.

Цитата(KSN @ Dec 9 2005, 14:23) *
Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу.

Истину глаголите. smile.gif volatile. smile.gif
arttab
Пока была только одна крутая хрень от компилятора.
Человек сделал следующее:
if чегото
if чегото2
продолжение проги

чегото и чегото2 не исчерпывали все возможные значения в условии, то есть были операции которые надо делать в любом случии.

прога работала не верно. Он залез в дебагер и увидел:
if чегото
else чегото2

сейчас он в отпуске кайфует,но если очень интересен код, могу попробовать связаться
KSN
Pultflag во истину volatile был объявлен изначально. Вот поэтому и возник вопрос: куда он этот код девал?
KRS
Попробуйте использовать 3.20D
в 3.10 были проблемы с volatile
достаточно просто заменить exeшник компилера
KSN
Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх?
KRS
Цитата(KSN @ Dec 9 2005, 13:49) *
Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх?


Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит.
Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает.


Я вот решил пока на 3.20D остаться.
IgorKossak
Код сам по себе ошибочный.
Компилятор старый.
Зато какое пафосное название темы!
KSN
[quote name='IgorKossak' post='70214' date='Dec 9 2005, 17:27']
Код сам по себе ошибочный.
Компилятор старый.
Зато какое пафосное название темы!
[/quote]
Оговорюсь: фрагмент кода, который в программе в данной последовательности не используется. Здесь приведен фрагмент, который я написал, чтобы поглядеть в отладчике что же происходит. Слова благодарности dxp, который на двух пальцах объяснил, как все это воспринимает компилятор(что собственно и хотелось услышать). Версия компилятора - абсолютно не при чем, если она не содержит в себе ошибок. И менее всего я уделял названию темы...

[quote name='KRS' date='Dec 9 2005, 17:09' post='70203']
[/quote]
Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит.
Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает.


Я вот решил пока на 3.20D остаться.
[/quote]
Где добыть можно 3.20D?
IgorKossak
Цитата(KSN @ Dec 9 2005, 13:47) *
Где добыть можно 3.20D?

Зайти по ссылке, далее - Product updates, далее - Version 3.20 и далее выбрать C или CPP обновлять.
Лечится уникраком.
Но перед этим надо снести и поставить заново непролеченную версию 3.20C.
KSN
Спасибо большое!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.