Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема в IAR (LPC2114)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Alex_rav(зеленинький я есть)
Что это за предупреждение, полностью так:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
выдается на строчке:

_Time += T0TC*3.39084e-8;

заранее спасибо.
diper
Цитата(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 как бы предполагает что это должно было быть сделано одновременно.
Alex_rav(зеленинький я есть)
Понял, спасибо......пошел курить учебник по С cool.gif
Сергей Борщ
Цитата(diper @ Apr 20 2007, 10:29) *
Компилер предупреждает что не может обеспечить "атомарность" обращения к _Time
Не совсем так. Он предупреждает, что в выражении кроме volatile _Time есть еще одна volatile - T0TC, и порядок доступа к ним отдан на откуп компилятору и может зависить от чего угодно. Чтобы избежать такого варнинга надо просто завести временную переменную:
Код
{
    uint32_t Tmp = T0TC*3.39084e-8;
    _Time += Tmp;
}
Теперь компилятор видит, что вы хотите сначала прочитать T0TC а потом _Time и неоднозначности не возникает. А ноги растут из того, что доступ к одной volatile - переменной может изменить значение в другой (скажем чтение старшего байта результата АЦП у AVR помещает новое значение в пару младший-старший). И тогда порядок доступа будет очень важен.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.