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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Задолбал 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
one_eight_seven
сообщение Aug 12 2011, 08:41
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 12 2011, 08:44
Сообщение #3


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

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



Цитата(one_eight_seven @ Aug 12 2011, 12:41) *
Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется.

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

И вообще, если вам нечего ответить - стоит ли засирать форум?
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Aug 12 2011, 08:53
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Фу, грубиян. Выложите как объявляли переменную и задавайте вопрос.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Aug 12 2011, 09:04
Сообщение #5


Знающий
****

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


Знающий
****

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


Гуру
******

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



Цитата(777777 @ Aug 12 2011, 12:31) *
Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры.

Не верю. Объявление структуры (и типа, и переменной) - в студию.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 12 2011, 10:13
Сообщение #8


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

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


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



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

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 - Aug 12 2011, 10:44
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 12 2011, 10:39
Сообщение #10


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



...

Сообщение отредактировал Genadi Zawidowski - Aug 12 2011, 10:40
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 12 2011, 10:40
Сообщение #11


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

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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #13


Гуру
******

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



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

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

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


Гуру
******

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



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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Aaron
сообщение Aug 12 2011, 12:06
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Если использовать typedef struct {...}, то надо сразу писать typedef volatile struct {...} type_name; и далее type_name our_struct;
Или же ещё вариант: если у вас только одна такая структура, то объявите её сразу:
struct {
volatile ...
volatile ...
} our_struct;
Go to the top of the page
 
+Quote Post

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

 


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


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