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

 
 
 
Reply to this topicStart new topic
> Warning[Pa082]: volatile accesses, Что за Warning и как с ним боротся
Lexy_one
сообщение Jul 27 2011, 08:12
Сообщение #1


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

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



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

Есть вопросик следующего плана....

В процессе написания программ часто возникают сообщения типа:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement ...

Как оказалось данное сообщение возникает например при включение нескольких переменных (volatile) в математические вычисления или при передаче их в функции...
Раньше боролся с этим путем создания темповых переменных и переприсвоения... Но считаю что данный подход не совсем правильный и хочу услишать мнения "знающих"

Что это именно означает это сообщение и как с ним праввильно бороться...

P.S. Уменя компилятор ИАР для АРМ версии 5.41 и для АВР версии 5.50 .... хотя на более ранней версии ИАР для АВР (3.1) данного сообщения не было..?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 27 2011, 08:31
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



При передаче в функцию volatile переменной есть два совершенно разных по смыслу подхода:
Код
volatile int x;
void func(int x);
func((int)x);

Код
volatile int x;
void func(volatile int* x);
func(&x);

Что Вам требуется то и выбирайте. Warning'a не будет в любом случае.

Цитата(Lexy_one @ Jul 27 2011, 12:12) *
Как оказалось данное сообщение возникает например при включение нескольких переменных (volatile) в математические вычисления или при передаче их в функции...
Раньше боролся с этим путем создания темповых переменных и переприсвоения... Но считаю что данный подход не совсем правильный и хочу услишать мнения "знающих"
Нормальный подход.
Вопрос в том что volatile должен применяться исключительно к месту а не абы как.
Если у Вас действительно есть необходимость в волатильности переменных то другого выхода кроме как их закешировать нет.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 27 2011, 08:39
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Lexy_one @ Jul 27 2011, 12:12) *
В процессе написания программ часто возникают сообщения типа:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement ...

Это сообщение предупреждает о неопределённом порядке использования volatile переменных.
То есть, в одном выражении используется сразу несколько таких переменных, и компилятор просит уточнить порядок их подстановки.
Если некритично, можно не обращать внимания.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Jul 27 2011, 09:01
Сообщение #4


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

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



Цитата(demiurg_spb @ Jul 27 2011, 11:31) *
Код
volatile int x;
void func(int x);
func((int)x);


Пробовал... приведение типа не помогает...
А вобще проблема возникает при передаче в функцию не одной а нескольких таких переменных.
При передаче одной волтательной переменной варнинг не вознакал.

Не обращать внимания конечно можно... но так может напродится варнингов... и тогда можно просто не заметить более важного сообщения.... я стараюсь приводить код в вид: 0 ерроров. 0 варнингов.

Сообщение отредактировал Lexy_one - Jul 27 2011, 09:04
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 27 2011, 09:04
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Не понял сразу что речь шла о более чем одном волатильном аргументе...
Цитата(Lexy_one @ Jul 27 2011, 13:01) *
Пробовал... приведение типа не помогает...
какое сообщение даёт компилятор то же, Pa082?
И что это за компилятор, IAR?

Тогда:
http://supp.iar.com/Support/?note=99411&am...m=search+result


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Jul 27 2011, 09:06
Сообщение #6


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

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



Цитата(demiurg_spb @ Jul 27 2011, 12:04) *
какое сообщение даёт компилятор?
И что это за компилятор такой?


Цитата(Lexy_one @ Jul 27 2011, 11:12) *
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement ...

P.S. Уменя компилятор ИАР для АРМ версии 5.41 и для АВР версии 5.50 .... хотя на более ранней версии ИАР для АВР (3.1) данного сообщения не было..?


Ссылку, данную вами видел... Да это помогает при мат вычислениях... но проблему с передачей параметров в функции не решает!

Сообщение отредактировал Lexy_one - Jul 27 2011, 09:13
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 27 2011, 09:15
Сообщение #7


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



я так понимаю, что если есть volatile переменная x, то варнинг вызовет даже выражение x * x. дело в том, что volatile означает для компилятора то, что значение переменной может быть изменено неизвестным ему способом в любой момент и поэтому надо на самом деле считывать значение из ячейки памяти всякий раз, когда она встречается в выражении. и вот обнаруживается, что в выражении х*х первый икс может оказаться не равным второму! и компилятор честно предупреждает программиста: парень, ты вообще в курсе, что может получиться из написанного тобой?

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 27 2011, 09:21
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Lexy_one @ Jul 27 2011, 13:06) *
... но проблему с передачей параметров в функции не решает!
Приведите реальный пример, как это делал я. Всем будет проще...

Цитата(ARV @ Jul 27 2011, 13:15) *
я так понимаю, что если есть volatile переменная x, то варнинг вызовет даже выражение x * x.
Это понятно.
ИМХО, это:
Код
volatile int x;
volatile int y;
void func(int x, int y);
func((int)x, (int)y);
должно пережёвываться молча.

А нет! Я не учел влияние порядка обращения к аргументам...
http://electronix.ru/forum/lofiversion/index.php/t13226.html
По-моему прекрасно всё разложено по полочкам.

Вывод: кешировать или подавлять варнинг прагмой, что менее эстетично на мой взгляд.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Jul 27 2011, 09:33
Сообщение #9


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

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



Спасибо за советы...

Как я понял.. кешырование переменных - ето один из наиболее правильных подходов для решения данной проблемы... Только так можно получить однозначное значение переменных при всех ее выборках...

Примера с функциями в данный момент привести не могу - так как обошел варнининги именно кешырованием переменных... а сейчас не помню где эти проблемы были sm.gif.

Приму во внимание все замечания СПАСИБО!!!

Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 27 2011, 09:54
Сообщение #10


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Lexy_one @ Jul 27 2011, 12:33) *
обошел варнининги именно кешырованием переменных... а сейчас не помню где эти проблемы были sm.gif .
а вы уверены, что обилие volatile переменных на самом деле необходимо? сначала сделать такую кучу переменных, а затем бороться с побочными эффектами путем кеширования - это как-то настораживает...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Jul 27 2011, 10:10
Сообщение #11


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

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



На самом деле обилия volatile переменных нету... их там 4-5....
А борьба идет с частными случаями (иногда возникающими).

Я и сам стараюсь без необходимости не использовать volatile
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 27 2011, 16:57
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Lexy_one @ Jul 27 2011, 12:10) *
А борьба идет с частными случаями (иногда возникающими).

Если уверны, что ни к каким побочным эффектам в данном выражении проблема с тем, что переменная volatile, не приведет (а это обычное дело при помянутой Вами передаче в функции), то просто
прикройте предупреждение с этом конкретном месте прагмой.
#pragma diag_suppress=Pa082
......
......
#pragma diag_warning=Pa082


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Jul 28 2011, 06:21
Сообщение #13


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

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



Да наверное в моем случае вариант с #pragma diag_suppress - это будет лучший вариант чем создавать не нужные переменные...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 28 2011, 07:08
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Lexy_one @ Jul 28 2011, 08:21) *
Да наверное в моем случае вариант с #pragma diag_suppress - это будет лучший вариант чем создавать не нужные переменные...

Насколько я понял описанную Вами часть проблем, то да.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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