Перейти к содержанию
    

Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры. То есть, к примеру, пишу

if(Command.Data[0] == 1)
    {
    ...
    }

а компилятор считает, что Data[0] всегда не равно 1 и поэтому выкидывает содержимое скобок.

Оказывается, нужно еще и каждое поле структуры объявлять volatile! Это что, нормально? Я же саму переменную Command объявил volatile, этого мало? По стандарту так положено? Или глюк в Кейле?

Изменено пользователем 777777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется.

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

 

И вообще, если вам нечего ответить - стоит ли засирать форум?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фу, грубиян. Выложите как объявляли переменную и задавайте вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я же саму переменную 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

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит в кале не соблюдают стандарты,

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

 

volatile struct x{

/*stuff*/

} volatile_x;

 

struct x non_volatile_x;

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры.

Не верю. Объявление структуры (и типа, и переменной) - в студию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не верю.

Я тоже в шоке.

 

Объявление структуры (и типа, и переменной) - в студию.

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

volatile CCommand Command;

Если Data[15] объявлено как u8, то не работает. Если Command без volatile, то тоже.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм. А вот так будет работать?

 

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.: Но на деле похоже на

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм. А вот так будет работать?

 

typedef volatile struct _CCommand VS_CCommand;

 

VS_CCommand Command;

 

volatile применяется к переменным, а не к объявлениям. Но я пробовал писать

typedef volatile struct _CCommand

{

...

u8 Data[15];

} CCommand;

- не помогает, хотя компилятор и не ругается.

Изменено пользователем 777777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бага в компиляторе. Стандарт языка (C99 - точно) говорит, что если переменную типа структура объявить как volatile, то все поля такой структуры тоже будут volatile (раздел 6.5.2.3 Structure and union members).

Update: проглядел, sasamy уже об этом сообщил.

Ну бага и бага. Значит, надо применить workaround, и он уже нашёлся, как я понял. А криворуким компиляторописателям выражаем протест.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бага в компиляторе.

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

 

777777, можете озвучить версию компилятора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сдается мне, что там дело вовсе не в volatile. Просто тыкая volatile куда не поподя удалось сломать оптимизацию компилятору настолько, что изначально мутный код что-то начал делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если использовать typedef struct {...}, то надо сразу писать typedef volatile struct {...} type_name; и далее type_name our_struct;

Или же ещё вариант: если у вас только одна такая структура, то объявите её сразу:

struct {

volatile ...

volatile ...

} our_struct;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...