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

 
 
> 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
Ответов (1 - 4)
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
ShiphT
сообщение Mar 25 2005, 07:12
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 7-12-04
Пользователь №: 1 383



Как сказал KRS - надо объявить переменную Key как volatile - это говорит компилятору, что эта переменная может изменяться "неведомым" ему способом, например в другом модуле/прерывании.
И еще, может проще написать
while(Key != OK) {
...}
А то как-то сразу без поллитры не понять что хочешь...
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Mar 25 2005, 08:02
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #5


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

Группа: Модераторы
Сообщений: 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 Текстовая версия Сейчас: 18th July 2025 - 01:05
Рейтинг@Mail.ru


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