Перейти к содержанию
    

IAR AVR 4.10A

Доброго дня!

Подскажите пожалуйста, как добиться от этого зверя корректной оптимизации? Что происходит - блок типа:

 

while(!(Key == OK)) {

...}

полностью выбрасывается компиллятором, т.к. переменная Key модифицируется в другом модуле, а тут объявлена, как external. ОК - константа.

помогает только полное отключение оптимизации.

Может быть есть какая-то хитрость, чтобы обмануть хитрого оптимизатора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как сказал KRS - надо объявить переменную Key как volatile - это говорит компилятору, что эта переменная может изменяться "неведомым" ему способом, например в другом модуле/прерывании.

И еще, может проще написать

while(Key != OK) {

...}

А то как-то сразу без поллитры не понять что хочешь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

надо описать как volatile

extern volatile тип K

 

А что, компилятор тоже без пол-литры не может понять, чего я хочу, и потому выбрасывает весь блок?

Да, кстати, действительно, объявление volatile решило проблему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

надо описать как volatile

extern volatile тип K

 

А что, компилятор тоже без пол-литры не может понять, чего я хочу, и потому выбрасывает весь блок?

Да, кстати, действительно, объявление volatile решило проблему.

 

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

 

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

Иначе бы всетки остался бесконечный цикл

 

Например

A=0

while (A) {

....

}

выбрасыватеся

 

A=1

while (A) {

....

}

делается бесконечным

 

но вот если вызвать не инлайн функцию

A=0

f();

while (A) {

f();

....

}

то тогда выкидывать ничего компилер не будет

 

или надо объявлять volatile

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...