Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: где я не прав, или опять ~volatile~
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Faradey
вот я так понял, что если есть глобальная переменная изменяемая в прерываниях, то ее объявляем так:
Код
volatile u08 Tx1_write=0;
volatile u08 Tx1_read=0;

тогда почему компилятор ругается:
Цитата
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

в этом месте :
Код
   if( Tx1_read==Tx1_write )
    return 0;

???
rezident
Компилятор не ругается, а всего лишь предупреждает, что порядок действий (доступа к переменным) не может быть однозначно определен. Раз тип переменных соответствует разрядности МК, то ничего страшного нет - наплюньте на это предупреждение. Но если тип переменных был бы больше, чем разрядность МК, то в этом случае нужно обязательно контролировать ассемблерный код. В плохом случае сравнение может быть выполнено неправильно.
Faradey
Цитата(rezident @ Nov 30 2006, 11:24) *
Компилятор не ругается, а всего лишь предупреждает, что порядок действий (доступа к переменным) не может быть однозначно определен. Раз тип переменных соответствует разрядности МК, то ничего страшного нет - наплюньте на это предупреждение. Но если тип переменных был бы больше, чем разрядность МК, то в этом случае нужно обязательно контролировать ассемблерный код. В плохом случае сравнение может быть выполнено неправильно.


спасибо за пояснение. А существует ли возможность не наблюдать этих предупреждений?

З.Ы. вот еще, а если скажем переменная 2-ух байтная, то для нее обязательна проверка асм.кода?
IgorKossak
Цитата(Faradey @ Nov 30 2006, 11:40) *
... существует ли возможность не наблюдать этих предупреждений?
...

Для каждого подобного случая:
Код
     #pragma diag_suppress=Pa082
     if (  ...  )
     #pragma diag_default=Pa082

Запрещать какие-либо сообщения глобально не стоит, т. к. это может обернуться боком.
dxp
Цитата(IgorKossak @ Nov 30 2006, 16:48) *
Цитата(Faradey @ Nov 30 2006, 11:40) *

... существует ли возможность не наблюдать этих предупреждений?
...

Для каждого подобного случая:
Код
     #pragma diag_suppress=Pa082
     if (  ...  )
     #pragma diag_default=Pa082

Запрещать какие-либо сообщения глобально не стоит, т. к. это может обернуться боком.

Еще есть способ явно обойти - сделать чтение таких переменных в локальные и сравнивать уже локальные.

Код
    ...
    rd = Tx1_read;
    wr = Tx1_write
    if(rd == wr) ...

По эффективности тут то же самое - компилятор эти вещи легко прооптимизирует.
Faradey
всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.