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

 
 
> IAR: Warning[Pa082]:, переменные volatile
prottoss
сообщение Feb 26 2006, 19:29
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Доброго времени суток!

Столкнулся с таким сообщением IAR Atmel AVR C/C++ Compiler V4.10B/W32, Evaluation Version

Имеется код:

Код
char volatile Line_Lenght1, Line_Lenght2;
char volatile Area_Height, Area_Width;

...

где-то в коде:

void Fun(void){

...

Area_Width = Line_Lenght1 + Line_Lenght2;

...

}


Для строчки "Area_Width = Line_Lenght1 + Line_Lenght2;" выводится предупреждение типа:

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

И так почти во всех местах, где производятся операции с несколькими "volatile". Проект отлично работает, но данные предупреждения немного раздражают. Привык, что проект компилируется "чисто", без Warning-ов.

Может кто знает, как победить их?


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alechin
сообщение Feb 27 2006, 13:34
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Насчет выкидывания volatile: при этом действительно можно получить неработоспособный код - IAR "слишком умный" - если в какой-либо процедуре идет чтение глобальной переменной, и перед этим в процедуре нет записи в нее - компилятор использование этой переменной молча (заметьтьте - молча) выбрасывает из кода. Я для MSP430 очень долго не мог понять - почему основной цикл программы с условием завершения по такой, не описанной как volatile, переменной полностью был исключен из кода! Компилятор посчитал, что раз переменная в цикле нигде не модифицируется, то цикл никогда не будет выполнен.
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 27 2006, 14:30
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Alechin @ Feb 27 2006, 19:34) *
Насчет выкидывания volatile: при этом действительно можно получить неработоспособный код - IAR "слишком умный" - если в какой-либо процедуре идет чтение глобальной переменной, и перед этим в процедуре нет записи в нее - компилятор использование этой переменной молча (заметьтьте - молча) выбрасывает из кода. Я для MSP430 очень долго не мог понять - почему основной цикл программы с условием завершения по такой, не описанной как volatile, переменной полностью был исключен из кода! Компилятор посчитал, что раз переменная в цикле нигде не модифицируется, то цикл никогда не будет выполнен.

И совершенно правильно он делает. И то, что докапывается до этого - честь ему и хвала, потому как действительно дотошный и придирчивый компилятор, генерирующий хороший код, глядя на который, писать что-то на асме пропадает в подавляющем большинстве случаев само собой.

Что касается volatile. Volatile, как сказали, указание компилятору не оптимизировать объект. На самом деле это не совсем правильно, не совсем точно. Volatile - более близкий по смыслу перевод, - означает, что объект "подвижный", асинхронно изменяемый, т.е. объект может быть срытно изменен вне данного потока управления программы. И, следовательно, запрещает не все оптимизации, а только те, которые могут нарушить правильность работы по причине асинхронной изменяемости. Другие оптимизации вполне имеют право быть. Например, есть в EWAVR оптимизация clustering variables. Она сводится к тому, что компилятор логически объединяет рядом объявленные глобальные/статические объекты в "вируальную структуру" и обращается к этим объектам, не загружая каждый раз полный адрес для каждого объекта, а загрузив одни раз базовый адрес этой "виртуальной структуры", обращается к объектам со смещением, что есть наиболее эффективный способ адресации в AVR. И если пропускать обращение к объекту, объявленному как volatile, компилятор не имеет права, то делать кластеризацию с этим объектом - пожалуйста.

Т.ч. тут все не в компилятор упирается, а в программиста. Ошибка эта очень распространенная, все на эти грабли наступают и не один раз. И даже опытные товарищи забывают (вернее, упускают из виду) и тоже мимо граблей не проходят. Но откаываться от хорошей оптимизации, имхо, все-таки неправильно.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- prottoss   IAR: Warning[Pa082]:   Feb 26 2006, 19:29
- - vet   Вот так: КодArea_Width = Line_Lenght1; Area_Width ...   Feb 26 2006, 19:41
|- - prottoss   Цитата(vet @ Feb 27 2006, 02:41) Вот так:...   Feb 26 2006, 19:53
- - vet   Они так и будут появляться, всё ж заvolatilено Ко...   Feb 26 2006, 19:57
|- - prottoss   Цитата(vet @ Feb 27 2006, 02:57) Они так ...   Feb 26 2006, 20:11
- - vet   Я бы поискал по листингам, что именно перестало ко...   Feb 26 2006, 20:18
- - defunct   Цитата(prottoss @ Feb 26 2006, 21:29) К...   Feb 26 2006, 20:34
|- - prottoss   Решил проблему... В модуле 12 глобальных переменн...   Feb 26 2006, 21:56
- - abbot   Эх, когда же начнут читать документацию? Volatile ...   Feb 26 2006, 23:26
|- - prottoss   2abbot : Спасибо за исчерпывающий ответ. А дока ч...   Feb 26 2006, 23:53
|- - vet   Alechin Можно глянуть на пример? для общего развит...   Feb 27 2006, 14:33
|- - Alechin   Цитата(vet @ Feb 27 2006, 17:33) Alechin ...   Feb 28 2006, 11:32
- - vet   Alechin Мне, собственно, потому хотелось бы глянут...   Feb 28 2006, 11:48


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

 


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


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