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

Вопрос к знатокам С.

В оригинальной библиотеке для STM32 квалификатор volatile стоит у каждого члена структуры:

typedef volatile unsigned short vu16;
typedef unsigned short u16;

typedef struct
{
  vu16 CR1;
  u16  RESERVED0;
  vu16 CR2;
  u16  RESERVED1;
  vu16 OAR1;
  u16  RESERVED2;
  vu16 OAR2;
  u16  RESERVED3;
  vu16 DR;
  u16  RESERVED4;
  vu16 SR1;
  u16  RESERVED5;
  vu16 SR2;
  u16  RESERVED6;
  vu16 CCR;
  u16  RESERVED7;
  vu16 TRISE;
  u16  RESERVED8;
} I2C_TypeDef;

По совету zltigo я попробовал с квалификатором перед всей структурой:

    typedef volatile struct
{
    unsigned short SR2;
} I2C_Type_Def;

Но, к сожалению, разницы нет.

Такая прикольная конструкция:

(void)I2C2_1->SR2;

действительно молча проглатывается - нет ни предупреждения, ни кода... :)

 

В общем, буду знать, что C++ не допускает выражений, подобных

...

variable_name_only;

...

 

:laughing:

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


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

Но, к сожалению, разницы нет.

И не должно быть. Я просто по привычке в естественной форме без ненужных излишеств написал.

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


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

Если, теоретически, структуры могут иметь этот атрибут,
Конечно могут, как и любые другие типы данных. Применение модификатора volatile (также как и const) к структуре распространяет его на все члены структуры.

 

Проблема в том, что компилятор плюсовый.
Точнее это бага плюсового компилятора. Я все-таки залез в стандарт С++, и вот что он пишет:

1.9 Program execution

6. The observable behavior of the abstract machine is its sequence of reads and writes to volatile data and calls to library I/O functions.

7. Accessing an object designated by a volatile lvalue (3.10), modifying an object, calling a library I/O function, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment. [...]

7.1.5.1 The cv-qualifiers

8. [Note: volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. See 1.9 for detailed semantics. In general, the semantics of volatile are intended to be the same in C++ as they are in C. ]

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


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

Точнее это бага плюсового компилятора. Я все-таки залез в стандарт С++, и вот что он пишет:

Хм, бага? В одной из последних версий RealView?

Неужели никто не использует подобные приёмы обращений к данным?

Тем более из плюсов? :05:

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


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

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

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

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

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

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

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

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

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

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