|
|
  |
Warning[Pa082]: volatile accesses, Что за Warning и как с ним боротся |
|
|
|
Jul 27 2011, 08:31
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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 должен применяться исключительно к месту а не абы как. Если у Вас действительно есть необходимость в волатильности переменных то другого выхода кроме как их закешировать нет.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 27 2011, 08:39
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Jul 27 2011, 09:01
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 27 2011, 09:04
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 27 2011, 09:06
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 27 2011, 09:15
|

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

|
я так понимаю, что если есть volatile переменная x, то варнинг вызовет даже выражение x * x. дело в том, что volatile означает для компилятора то, что значение переменной может быть изменено неизвестным ему способом в любой момент и поэтому надо на самом деле считывать значение из ячейки памяти всякий раз, когда она встречается в выражении. и вот обнаруживается, что в выражении х*х первый икс может оказаться не равным второму! и компилятор честно предупреждает программиста: парень, ты вообще в курсе, что может получиться из написанного тобой?
в случае, когда разные volatile-переменные используются в одном выражении или передаются в одну функцию, ситуация аналогична, т.е. потенциально неизвестно, какое значение будет на самом деле использовано.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jul 27 2011, 09:21
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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По-моему прекрасно всё разложено по полочкам. Вывод: кешировать или подавлять варнинг прагмой, что менее эстетично на мой взгляд.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 27 2011, 09:33
|

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

|
Спасибо за советы... Как я понял.. кешырование переменных - ето один из наиболее правильных подходов для решения данной проблемы... Только так можно получить однозначное значение переменных при всех ее выборках... Примера с функциями в данный момент привести не могу - так как обошел варнининги именно кешырованием переменных... а сейчас не помню где эти проблемы были  . Приму во внимание все замечания СПАСИБО!!!
|
|
|
|
|
Jul 27 2011, 16:57
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|