Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR AVR 4.10A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sergio66
Доброго дня!
Подскажите пожалуйста, как добиться от этого зверя корректной оптимизации? Что происходит - блок типа:

while(!(Key == OK)) {
...}
полностью выбрасывается компиллятором, т.к. переменная Key модифицируется в другом модуле, а тут объявлена, как external. ОК - константа.
помогает только полное отключение оптимизации.
Может быть есть какая-то хитрость, чтобы обмануть хитрого оптимизатора?
KRS
надо описать как volatile
extern volatile тип K
ShiphT
Как сказал KRS - надо объявить переменную Key как volatile - это говорит компилятору, что эта переменная может изменяться "неведомым" ему способом, например в другом модуле/прерывании.
И еще, может проще написать
while(Key != OK) {
...}
А то как-то сразу без поллитры не понять что хочешь...
Sergio66
Цитата(KRS @ Mar 24 2005, 14:15)
надо описать как volatile
extern volatile тип K
*


А что, компилятор тоже без пол-литры не может понять, чего я хочу, и потому выбрасывает весь блок?
Да, кстати, действительно, объявление volatile решило проблему.
KRS
Цитата(Sergio66 @ Mar 25 2005, 11:02)
Цитата(KRS @ Mar 24 2005, 14:15)
надо описать как volatile
extern volatile тип K
*


А что, компилятор тоже без пол-литры не может понять, чего я хочу, и потому выбрасывает весь блок?
Да, кстати, действительно, объявление volatile решило проблему.
*



Компилятор как раз делает правильно! так и должно быть. Вот если бы вы вызывали внутри цикла функцию тогда все ок! а если в прерывании переменная меняется она должна быть volatile

А весь цикл выбросился скорее из-за того, что начальное значение перед ним присваивалось, а потом функции не вызывались и модификации не было.
Иначе бы всетки остался бесконечный цикл

Например
A=0
while (A) {
....
}
выбрасыватеся

A=1
while (A) {
....
}
делается бесконечным

но вот если вызвать не инлайн функцию
A=0
f();
while (A) {
f();
....
}
то тогда выкидывать ничего компилер не будет

или надо объявлять volatile
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.