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

 
 
 
Reply to this topicStart new topic
> проблема в IAR (LPC2114), Warning[Pa082]: undefined behavior......
Alex_rav(зеленин...
сообщение Apr 20 2007, 11:24
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 46
Регистрация: 29-01-07
Из: Саратов
Пользователь №: 24 841



Что это за предупреждение, полностью так:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
выдается на строчке:

_Time += T0TC*3.39084e-8;

заранее спасибо.

Сообщение отредактировал Alex_rav(зеленинький я есть) - Apr 20 2007, 11:25
Go to the top of the page
 
+Quote Post
diper
сообщение Apr 20 2007, 11:29
Сообщение #2


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

Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750



Цитата(Alex_rav(зеленинький я есть) @ Apr 20 2007, 12:24) *
Что это за предупреждение, полностью так:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
выдается на строчке:

_Time += T0TC*3.39084e-8;

заранее спасибо.


_Time объявлена как volatile. Компилер предупреждает что не может обеспечить "атомарность" обращения к _Time, тк. ты сначала ее читаешь а потом записываешь. А volatile как бы предполагает что это должно было быть сделано одновременно.
Go to the top of the page
 
+Quote Post
Alex_rav(зеленин...
сообщение Apr 20 2007, 12:01
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 46
Регистрация: 29-01-07
Из: Саратов
Пользователь №: 24 841



Понял, спасибо......пошел курить учебник по С cool.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 20 2007, 12:17
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(diper @ Apr 20 2007, 10:29) *
Компилер предупреждает что не может обеспечить "атомарность" обращения к _Time
Не совсем так. Он предупреждает, что в выражении кроме volatile _Time есть еще одна volatile - T0TC, и порядок доступа к ним отдан на откуп компилятору и может зависить от чего угодно. Чтобы избежать такого варнинга надо просто завести временную переменную:
Код
{
    uint32_t Tmp = T0TC*3.39084e-8;
    _Time += Tmp;
}
Теперь компилятор видит, что вы хотите сначала прочитать T0TC а потом _Time и неоднозначности не возникает. А ноги растут из того, что доступ к одной volatile - переменной может изменить значение в другой (скажем чтение старшего байта результата АЦП у AVR помещает новое значение в пару младший-старший). И тогда порядок доступа будет очень важен.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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