реклама на сайте
подробности

 
 
> Задолбал volatile!, Keil, STM32
777777
сообщение Aug 12 2011, 08:31
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Aug 12 2011, 11:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Бага в компиляторе. Стандарт языка (C99 - точно) говорит, что если переменную типа структура объявить как volatile, то все поля такой структуры тоже будут volatile (раздел 6.5.2.3 Structure and union members).
Update: проглядел, sasamy уже об этом сообщил.
Ну бага и бага. Значит, надо применить workaround, и он уже нашёлся, как я понял. А криворуким компиляторописателям выражаем протест.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 12 2011, 11:36
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(scifi @ Aug 12 2011, 15:17) *
Бага в компиляторе.

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

777777, можете озвучить версию компилятора?
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 12 2011, 12:17
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 12 2011, 12:29
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (777777 @ Aug 12 2011, 15:17) *
А вы не любите пролетариат!

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 777777   Задолбал volatile!   Aug 12 2011, 08:31
- - one_eight_seven   Но ведь решение найдено и известно. Как вариант - ...   Aug 12 2011, 08:41
|- - 777777   Цитата(one_eight_seven @ Aug 12 2011, 12...   Aug 12 2011, 08:44
- - one_eight_seven   Фу, грубиян. Выложите как объявляли переменную и з...   Aug 12 2011, 08:53
- - sasamy   Цитата(777777 @ Aug 12 2011, 12:31) Я же ...   Aug 12 2011, 09:04
- - one_eight_seven   ЦитатаЗначит в кале не соблюдают стандарты, Не иск...   Aug 12 2011, 09:21
- - scifi   Цитата(777777 @ Aug 12 2011, 12:31) Имеет...   Aug 12 2011, 09:23
|- - 777777   Цитата(scifi @ Aug 12 2011, 13:23) Не вер...   Aug 12 2011, 10:13
- - one_eight_seven   Хм. А вот так будет работать? struct _CCommand ...   Aug 12 2011, 10:35
|- - 777777   Цитата(one_eight_seven @ Aug 12 2011, 14...   Aug 12 2011, 10:40
- - Genadi Zawidowski   ...   Aug 12 2011, 10:39
|- - 365   Цитата(777777 @ Aug 12 2011, 16:17) А уж ...   Aug 15 2011, 04:00
- - zltigo   Сдается мне, что там дело вовсе не в volatile. Пр...   Aug 12 2011, 11:39
- - Aaron   Если использовать typedef struct {...}, то надо ср...   Aug 12 2011, 12:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 20:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016