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

 
 
 
Reply to this topicStart new topic
> avr306, Предупреждение компилятора
alux
сообщение Mar 23 2008, 14:51
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Разбираюсь с этим апнотом. IAR v.5.10A выдает предупреждения на сравнения двух volatile глобальных переменных:
Код
// Static Variables
static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART_RxHead;
static volatile unsigned char UART_RxTail;
static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART_TxHead;
static volatile unsigned char UART_TxTail;
.......................
#pragma vector=USART0_UDRE_vect
__interrupt void USART0_TX_interrupt( void )
{
  unsigned char tmptail;

  // Check if all data is transmitted
  if ( UART_TxHead != UART_TxTail ) <<<< Warning
  {
......
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

Переменные UART_TxHead , UART_TxTail, UART_RxHead, UART_RxTail проинициализированы 0 в uart_Init() до разрешения прерываний. Как правильно поступить в данном случае:
1) не обращать внимания на предупреждения
2) заблокировать выдачу сообщений
3) убрать volatile при объявлении этих переменных ?
Если убрать volatile в одной из сравниваемой переменной, то варнинги не выдает. Но не будет ли при этом проблем с оптимизацией?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 23 2008, 15:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(alux @ Mar 23 2008, 17:51) *
2) заблокировать выдачу сообщений

Переменные байтовые. Сравнение идет в обработчике прерывания. В данном конкретном случае задавить warning для одной этой строчки допустимо.
Цитата
..убрать volatile в одной из сравниваемой переменной,

Можно или нет так делать зависит уже от того, как построена ВСЯ работа с ними.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 23 2008, 18:48
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



4) добавте локальную переменную
Код
....................
  unsigned char tmp;
....................

  tmp = UART_TxHead;

  if ( tmp != UART_TxTail )
  {
.................

и варнинги давить не придется
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 24 2008, 04:37
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Почему в данном примере в uart_Init() переменные инициализируются 0 ?
Код
void uart_Init(unsigned int ubrr)
{
  unsigned char x;
    
...........
  x = 0;                 // Flush receive buffer
  UART_RxTail = x;
  UART_RxHead = x;
  UART_TxTail = x;
  UART_TxHead = x;  
}
И почему это делается через переменную х, а не просто через присвоение 0 ? Ведь они же объявлены как статические, поэтому по умолчанию должны быть проинициализированы 0. Или для static volatile это правило не распространяется?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 24 2008, 06:17
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(alux @ Mar 24 2008, 06:37) *
Почему в данном примере в uart_Init() переменные инициализируются 0 ?
И почему это делается через переменную х, а не просто через присвоение 0 ? Ведь они же объявлены как статические, поэтому по умолчанию должны быть проинициализированы 0. Или для static volatile это правило не распространяется?

По умолчанию обнуляются переменные, определённые на уровне функций и без инициализирующих значений.
static и volatile на это никакого влияния не оказывают.
Очевидно в uart_Init() это делается с целью их инициализации в любое время, а не только в C_startup.
Почему через переменную? Видимо это какая-то ручная оптимизация. Попробуйте так и эдак и сравните листинг.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:00
Рейтинг@Mail.ru


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