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

 
 
> Предупреждение от IAR
DVF
сообщение Jul 25 2012, 12:45
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 26-07-06
Из: Саратов
Пользователь №: 19 097



Почему в данной ситуации получаю предупреждение: 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) )
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Jul 25 2012, 12:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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) );

и предупреждение исчезнет.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jul 25 2012, 17:14
Сообщение #3


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(_Артём_ @ 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 запросто могут быть переменные, значение которых изменяется в прерываниях. И если забыть о том что могут быть изменения значений переменных подобного рода, то можна напороться на необъяснимые поведения программы.

Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 16:14
Рейтинг@Mail.ru


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