реклама на сайте
подробности

 
 
> IAR AVR 4.10A, Как добиться короректной оптимизации
Sergio66
сообщение Mar 24 2005, 10:35
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



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

while(!(Key == OK)) {
...}
полностью выбрасывается компиллятором, т.к. переменная Key модифицируется в другом модуле, а тут объявлена, как external. ОК - константа.
помогает только полное отключение оптимизации.
Может быть есть какая-то хитрость, чтобы обмануть хитрого оптимизатора?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Mar 24 2005, 11:15
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



надо описать как volatile
extern volatile тип K
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Mar 25 2005, 08:02
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(KRS @ Mar 24 2005, 14:15)
надо описать как volatile
extern volatile тип K
*


А что, компилятор тоже без пол-литры не может понять, чего я хочу, и потому выбрасывает весь блок?
Да, кстати, действительно, объявление volatile решило проблему.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 25 2005, 08:58
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.03755 секунд с 7
ELECTRONIX ©2004-2016