Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Предупреждение от IAR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
DVF
Почему в данной ситуации получаю предупреждение: Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement?
Код
#pragma vector = TIMER1_COMPA_vect
__interrupt void TIMER1_COMPA(void)
{
  unsigned short data = (unsigned short)( (PIND & 0xF3) | ((PINB & 0x06)<<1) )
}
_Артём_
Цитата(DVF @ Jul 25 2012, 15:45) *
Почему в данной ситуации получаю предупреждение: Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement?
Код
#pragma vector = TIMER1_COMPA_vect
__interrupt void TIMER1_COMPA(void)
{
  unsigned short data = (unsigned short)( (PIND & 0xF3) | ((PINB & 0x06)<<1) )
}

Потому что в правой части выражения две volatile-переменных: PIND и PINB.
Можете заменить:
Код
unsigned char pind=PIND, pinb=PINB;
unsigned short data = (unsigned short)( (pind & 0xF3) | ((pinb & 0x06)<<1) );

и предупреждение исчезнет.
DVF
Да, спасибо, такое проделывал. Просто думал, как бы это через макрос (#define) воплотить.
xemul
Зачем усложнять жизнь компилятору?
Код
unsigned short data = PIND & 0xF3;
data |= (PINB & 0x06)<<1;
Xenia
О чем спор? Запретить выдавать Warning[Pa082] и дело с концом! sm.gif Тем более что средства для блокировки нежелательных варнингов у компилятора имеются.

Кстати, старые версии IAR на такие вещи не ругались. Да и здравый смысл протестует против такого варнинга, поскольку порядок выполнения операций (precedence) в выражениях жестко определен не только в C, но и в остальных языках программирования. А раз порядок выполнения операций в выражениях определен, то как может быть так, чтобы "accesses is undefined"? Очевидно, что accesses тут тот же самый, что и у порядка выполнения операций.

Вот если бы я так написала:
if( PIND < PINB) {}
то дело другое, тут бы я, пожалуй, не стала протестовать против данного варнинга.
mempfis_
Цитата(_Артём_ @ Jul 25 2012, 15:53) *
Потому что в правой части выражения две volatile-переменных: PIND и PINB.
Можете заменить:
Код
unsigned char pind=PIND, pinb=PINB;
unsigned short data = (unsigned short)( (pind & 0xF3) | ((pinb & 0x06)<<1) );

и предупреждение исчезнет.


+1 за этот вариант.
Зафиксируете состояние пинов в текущий момент и будуту владеть более-менее актуальной информацией о них в текущий момент.
Запрещать варнинги связанные с предупреждениями о доступе к volatile-переменным не стоит. Они для того и созданы чтобы программист задумался о том, что некоторые переменные могут изменится (напрю в прерывании или другим неизвестным компилятору образом), пока идёт обработка различных сложных условий, приведённых в первом посте. Вместо PINB/D запросто могут быть переменные, значение которых изменяется в прерываниях. И если забыть о том что могут быть изменения значений переменных подобного рода, то можна напороться на необъяснимые поведения программы.

Сергей Борщ
QUOTE (Xenia @ Jul 25 2012, 19:38) *
порядок выполнения операций (precedence) в выражениях жестко определен не только в C, но и в остальных языках программирования.
Приоритет операций - да. Порядок вычисления подвыражений - нет.
QUOTE (Xenia @ Jul 25 2012, 19:38) *
то как может быть так, чтобы "accesses is undefined"?
Обращение к одной переменной может вызвать изменение другой. Например, чтение/запись UDR в любимых вами AVR сбразывает/устанавливает флаг RXC/UDRE. Не стоит огульно обвинять авторов компиляторов в глупости - часто они знают то, что вам и в голову не приходило.
QUOTE (Xenia @ Jul 25 2012, 19:38) *
Очевидно, что accesses тут тот же самый, что и у порядка выполнения операций.
Как раз таки очевидно, что access order может быть любым.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.