Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задолбал volatile!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
777777
Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры. То есть, к примеру, пишу
Код
if(Command.Data[0] == 1)
    {
    ...
    }

а компилятор считает, что Data[0] всегда не равно 1 и поэтому выкидывает содержимое скобок.
Оказывается, нужно еще и каждое поле структуры объявлять volatile! Это что, нормально? Я же саму переменную Command объявил volatile, этого мало? По стандарту так положено? Или глюк в Кейле?
one_eight_seven
Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется.
777777
Цитата(one_eight_seven @ Aug 12 2011, 12:41) *
Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется.

Для этого надо как минимум иметь легальный Кейл.

И вообще, если вам нечего ответить - стоит ли засирать форум?
one_eight_seven
Фу, грубиян. Выложите как объявляли переменную и задавайте вопрос.
sasamy
Цитата(777777 @ Aug 12 2011, 12:31) *
Я же саму переменную Command объявил volatile, этого мало? По стандарту так положено? Или глюк в Кейле?


Значит в кале не соблюдают стандарты, по крайней мере ISO/IEC 9899:1999

6.5.2.3 Structure and union members

Цитата
7 EXAMPLE 2 In:
struct s { int i; const int ci; };
struct s s;
const struct s cs;
volatile struct s vs;
the various members have the types:
s.i int
s.ci const int
cs.i const int
cs.ci const int
vs.i volatile int
vs.ci volatile const int
one_eight_seven
Цитата
Значит в кале не соблюдают стандарты,

Не исключено. Но также не исключено неверное объявление.

volatile struct x{
/*stuff*/
} volatile_x;

struct x non_volatile_x;
scifi
Цитата(777777 @ Aug 12 2011, 12:31) *
Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры.

Не верю. Объявление структуры (и типа, и переменной) - в студию.
777777
Цитата(scifi @ Aug 12 2011, 13:23) *
Не верю.

Я тоже в шоке.

Цитата(scifi @ Aug 12 2011, 13:23) *
Объявление структуры (и типа, и переменной) - в студию.

Код
typedef struct _CCommand
    {
    u8 Length;
    u8 Cmd : 4;
    u8 Addr : 4;
    vu8 Data[15];
    } CCommand;

volatile CCommand Command;

Если Data[15] объявлено как u8, то не работает. Если Command без volatile, то тоже.
one_eight_seven
Хм. А вот так будет работать?

struct _CCommand
{
u8 Length;
u8 Cmd : 4;
u8 Addr : 4;
vu8 Data[15];
};

typedef volatile struct _CCommand VS_CCommand;

VS_CCommand Command;

P.S.: если vu8 - это volatile unsigned char, то вместо него просто u8.
P.P.S.: Но на деле похоже на
Genadi Zawidowski
...
777777
Цитата(one_eight_seven @ Aug 12 2011, 14:35) *
Хм. А вот так будет работать?

typedef volatile struct _CCommand VS_CCommand;

VS_CCommand Command;


volatile применяется к переменным, а не к объявлениям. Но я пробовал писать
typedef volatile struct _CCommand
{
...
u8 Data[15];
} CCommand;
- не помогает, хотя компилятор и не ругается.
scifi
Бага в компиляторе. Стандарт языка (C99 - точно) говорит, что если переменную типа структура объявить как volatile, то все поля такой структуры тоже будут volatile (раздел 6.5.2.3 Structure and union members).
Update: проглядел, sasamy уже об этом сообщил.
Ну бага и бага. Значит, надо применить workaround, и он уже нашёлся, как я понял. А криворуким компиляторописателям выражаем протест.
aaarrr
Цитата(scifi @ Aug 12 2011, 15:17) *
Бага в компиляторе.

Звучит почти невероятно. Всякое бывает, конечно, но не верится как-то, чтобы не всплыл такой косяк.

777777, можете озвучить версию компилятора?
zltigo
Сдается мне, что там дело вовсе не в volatile. Просто тыкая volatile куда не поподя удалось сломать оптимизацию компилятору настолько, что изначально мутный код что-то начал делать.
Aaron
Если использовать typedef struct {...}, то надо сразу писать typedef volatile struct {...} type_name; и далее type_name our_struct;
Или же ещё вариант: если у вас только одна такая структура, то объявите её сразу:
struct {
volatile ...
volatile ...
} our_struct;
777777
Цитата(aaarrr @ Aug 12 2011, 15:36) *
Звучит почти невероятно. Всякое бывает, конечно, но не верится как-то, чтобы не всплыл такой косяк.

Ничего невероятного. Я находил баг даже в Visual Studio 7.1, правда не критичный - переменная const не воспринималась компилятором как const. А уж Кейл - не самая передовая фирма.
Цитата(aaarrr @ Aug 12 2011, 15:36) *
777777, можете озвучить версию компилятора?

µVision V4.00u
Toolchain: RealView MDK-ARM Version: 4.03a
Toolchain Path: BIN40\
C Compiler: Armcc.Exe V4.0.0.524
Assembler: Armasm.Exe V4.0.0.524
Linker/Locator: ArmLink.Exe V4.0.0.524
Librarian: ArmAr.Exe V4.0.0.524
Hex Converter: FromElf.Exe V4.0.0.524
CPU DLL: SARMCM3.DLL V4.03a
Dialog DLL: DARMSTM.DLL V1.45b
Target DLL: BIN\UL2CM3.DLL V1.62
Dialog DLL: TARMSTM.DLL V1.43


Цитата(zltigo @ Aug 12 2011, 15:39) *
Сдается мне, что там дело вовсе не в volatile. Просто тыкая volatile куда не поподя удалось сломать оптимизацию компилятору настолько, что изначально мутный код что-то начал делать.

А вы не любите пролетариат!

Цитата(Aaron @ Aug 12 2011, 16:06) *
Или же ещё вариант: если у вас только одна такая структура, то объявите её сразу:
struct {
volatile ...
volatile ...
} our_struct;

Именно так и пришлось поступить - все члены сделал volatile
zltigo
QUOTE (777777 @ Aug 12 2011, 15:17) *
А вы не любите пролетариат!

Ну так десяток РЕАЛЬНЫХ строк приведите в качестве багрепорта. Тогда и будет ясно, кто есть ху. Для меня пока очень подозрительным является вообще написание кода в котором требуется заметное количество volatile переменых. Практически видно, что Вы заставили что-то работать объявив volatile весь фрейм. Исходя из личного опыта считаю такой подход к программированию достаточно странным.

365
Цитата(777777 @ Aug 12 2011, 16:17) *
А уж Кейл - не самая передовая фирма.

ммм... А это ничего, что Кейл, собсно не фирма, а торговая марка ARM Holdings?
Да, и в RealView volatile работает правильно. В смысле, в полном соответствии со стандартом.

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