|
Задолбал 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 17)
|
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
|
|
|
|
|
Aug 12 2011, 12:17
|

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

|
Цитата(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
|
|
|
|
|
Aug 15 2011, 04:00
|
Группа: Новичок
Сообщений: 5
Регистрация: 26-07-11
Пользователь №: 66 421

|
Цитата(777777 @ Aug 12 2011, 16:17)  А уж Кейл - не самая передовая фирма. ммм... А это ничего, что Кейл, собсно не фирма, а торговая марка ARM Holdings? Да, и в RealView volatile работает правильно. В смысле, в полном соответствии со стандартом. Приведите плз кусок кода и опции компилятора.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|