|
Задолбал volatile!, Keil, STM32 |
|
|
|
Aug 12 2011, 08:31
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры. То есть, к примеру, пишу Код if(Command.Data[0] == 1) { ... } а компилятор считает, что Data[0] всегда не равно 1 и поэтому выкидывает содержимое скобок. Оказывается, нужно еще и каждое поле структуры объявлять volatile! Это что, нормально? Я же саму переменную Command объявил volatile, этого мало? По стандарту так положено? Или глюк в Кейле?
Сообщение отредактировал 777777 - Aug 12 2011, 08:41
|
|
|
|
|
Aug 12 2011, 09:04
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(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
Сообщение отредактировал sasamy - Aug 12 2011, 09:09
|
|
|
|
|
Aug 12 2011, 09:21
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата Значит в кале не соблюдают стандарты, Не исключено. Но также не исключено неверное объявление. volatile struct x{ /*stuff*/ } volatile_x; struct x non_volatile_x;
Сообщение отредактировал one_eight_seven - Aug 12 2011, 09:24
|
|
|
|
|
Aug 12 2011, 10:13
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(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, то тоже.
|
|
|
|
|
Aug 12 2011, 10:40
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(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; - не помогает, хотя компилятор и не ругается.
Сообщение отредактировал 777777 - Aug 12 2011, 10:44
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|