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

 
 
> 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
Ответов
abbot
сообщение Feb 26 2006, 23:26
Сообщение #2





Группа: Новичок
Сообщений: 8
Регистрация: 16-02-06
Пользователь №: 14 395



Эх, когда же начнут читать документацию?
Volatile означает, что компилятору и оптимизатору запрещается делать какие-либо предположения относительно значения данной переменной, и обязательно необходимо читать эту переменную перед тем, как делать с ней что-либо (конечно, если эта переменная находится не в регистре, а в памяти). Больше ничего volatile не означает.

Откуда берется предупреждение: в вашем коде присутствует конструкция
Area_Width = Line_Lenght1 + Line_Lenght2;
в которой все переменные - volatile.
Если с присваиванием никаких вопросов у компилятора не возникает, то относительно конструкции Line_Length1 + Line_Length2 компилятор не знает, в каком порядке нужно прочитать значения переменных перед выполнением сложения - сначла первую, потом вторую, или наоборот. Очевидно, что результат может зависить от порядка, если значения переменных меняются, например, в ISR. И именно об этом компилятор вам и выводит предупреждение: он не может дать гарантии, в каком порядке произойдет чтение этих переменных перед сложением.

А теперь внимание, советы, которые здесь давали.
Ни в коем случае не стоит делать такой код!
Цитата
Area_Width = Line_Length1;
Area_Width += Line_Length2;

Он скомпилируется примерно в такое:
Загрузить Line_Length1 в регистр
Загрузить регистр в Area_Width
Загрузить Area_Width в регистр (это компилятор делает, так как Area_Width - тоже volatile и он мог измениться между этими двумя инструкциями)
Загрузить Line_Length2 в регистр
Сложить
Загрузить регистр в Area_Width

Как сделать правильно:
Цитата
register char tmp
tmp = Line_Length1;
Area_Width = tmp + Line_Length2;

Это скомпилируется в:
загрузить Line_Length1 в регистр
загрузить Line_Length2 в регистр
Сложить
Загрузить регистр в Area_Width

А вообще, почитайте документацию от IAR'а, которая идет в PDF'ах. Там много интересного пишут.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 26 2006, 23:53
Сообщение #3


Гуру
******

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



2abbot :

Спасибо за исчерпывающий ответ. А дока читается по мере возникновения вопросов :-).


--------------------
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
- - Alechin   Насчет выкидывания volatile: при этом действительн...   Feb 27 2006, 13:34
|- - dxp   Цитата(Alechin @ Feb 27 2006, 19:34) Насч...   Feb 27 2006, 14:30
|- - 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 Текстовая версия Сейчас: 28th July 2025 - 17:16
Рейтинг@Mail.ru


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