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

 
 
> Вопрос к знатокам С.
demiurg_spb
сообщение Oct 20 2008, 16:04
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Возник тут вопрос.
Кусочек программы можно написать двумя способами,
но с одним и тем же правильным результатом (компилятор avr-gcc 4.1.2).
Вопрос: это можно взять на вооружение?
И что стандарт может нам сказать по этому поводу?
Спасибо.
Код
//============================================
    unsigned char temp;

    temp = *uart->pUDR;   // Очищаем буфер 3-его уровня.
    temp = *uart->pUDR;  
    temp = *uart->pUDR;  

//============================================
    *uart->pUDR;   // Очищаем буфер 3-его уровня.
    *uart->pUDR;  
    *uart->pUDR;


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Oct 20 2008, 16:17
Сообщение #2


Гуру
******

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



Цитата(demiurg_spb @ Oct 20 2008, 18:04) *
Вопрос: это можно взять на вооружение?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 4 2009, 11:12
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(zltigo @ Oct 20 2008, 20:17) *
Поскольку регистры uart безвариантно являются и прописаны как volatile, то несомнено второй вариант, ибо явные промежуточные переменные просто совсем не нужны.

Что-то не получается обойтись без временной переменной.
Вот код:
Код
void    i2cStartRead(dword address)
{
    ...
        //dword    temp = I2C2->SR2;
    I2C2->SR2;
}

на что компилер (RV) ругается: i2c.cpp(71): warning: #174-D: expression has no effect

Тот же самый код разложенный по "полочкам":
Код
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;

void    i2cStartRead(dword address)
{
        ...
    ((I2C_TypeDef *) (((u32)0x40000000) + 0x5800))->SR2;
}

Как убрать предупреждение компилятора, и обойтись без явной временной переменной?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 4 2009, 14:31
Сообщение #4


Гуру
******

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



Цитата(sonycman @ Jan 4 2009, 14:12) *
Как убрать предупреждение компилятора, и обойтись без явной временной переменной?

Что-то я совсем не понял, что и как Вы собственно написали sad.gif. А вообще так:
Код
typedef volatile struct
{
    unsigned short SR2;
.....
} I2C_TypeDef;

I2C_TypeDef *I2C2 =  (I2C_TypeDef *)(0x40000000 + 0x5800);

void i2cStartRead(void)
{
....
    I2C2->SR2;

}

P.S.
И вместо мути в структуре ввиде 'reserved' используйте 32bit паковку.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 4 2009, 15:42
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(zltigo @ Jan 4 2009, 18:31) *
Что-то я совсем не понял, что и как Вы собственно написали sad.gif. А вообще так...

P.S.
И вместо мути в структуре ввиде 'reserved' используйте 32bit паковку.

Так эта муть - библиотека ST для STM32. Я из неё использую только определения регистров.
Ну её нафиг переделывать, и так пришлось править, чтобы хидеры из C++ компилировались... smile.gif

Попробовал, как Вы подсказали:
Код
    typedef volatile struct
{
    int    a;
    int    b;
    unsigned short SR2;

} I2C_Type_Def;
    
    I2C_Type_Def * I2C2_1 =  (I2C_Type_Def *)(0x40000000 + 0x5800);

    I2C2_1->SR2;

но компилятор по-прежнему ругается: main.cpp(26): warning: #174-D: expression has no effect
и выкидывает из кода эту строку... 07.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 4 2009, 16:22
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(sonycman @ Jan 4 2009, 21:42) *
Попробовал, как Вы подсказали:
Код
    typedef volatile struct
{
    int    a;
    int    b;
    unsigned short SR2;

} I2C_Type_Def;
    
    I2C_Type_Def * I2C2_1 =  (I2C_Type_Def *)(0x40000000 + 0x5800);

    I2C2_1->SR2;

но компилятор по-прежнему ругается: main.cpp(26): warning: #174-D: expression has no effect
и выкидывает из кода эту строку... 07.gif

Впервые вижу волатильную структуру smile.gif Может я ошибаюсь, но только переменная может иметь этот атрибут. Попробуйте объявить так:
Код
    (volatile I2C_Type_Def *)(0x40000000 + 0x5800)->SR2;

Потом проверьте есть ли в листинге чтение этого регистра.

Я написал без временной переменной, но если она нужна или надо делать несколько чтений, то можно так:
Код
    volatile I2C_Type_Def * I2C2_1 =  (volatile I2C_Type_Def *)(0x40000000 + 0x5800);

    I2C2_1->SR2;


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 4 2009, 16:27
Сообщение #7


Гуру
******

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



Цитата(GetSmart @ Jan 4 2009, 19:22) *
но только переменная может иметь этот атрибут...

С чего-бы это вдруг, тем более, что сами написали
volatile I2C_Type_Def * I2C2_1
А если хотели
I2C_Type_Def * volatile I2C2_1
так это совсем другое....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 4 2009, 17:05
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jan 4 2009, 22:27) *
С чего-бы это вдруг, тем более, что сами написали
volatile I2C_Type_Def * I2C2_1
А если хотели
I2C_Type_Def * volatile I2C2_1
так это совсем другое....

Не, не. Я правильно выразил свою мысль в кодеsmile.gif
<<volatile I2C_Type_Def *>> говорит, что там, по адресу будет лежать волатильная структура/переменная. Переменная с адресом (I2C2_1) не должна/обязана быть волатильной. Разглядывая чужие хидеры, например из ИАРа, я ни разу не встречал волатил при объявлении структур, а вот при объявлении переменных - всегда. Поэтому и удивился. Если, теоретически, структуры могут иметь этот атрибут, то возможно проблема у sonycman-а в том, что компилятор не учитывает волатил из структуры, но будет учитывать при непосредственном объявлении в переменной. Проверить-то легко.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 4 2009, 19:00
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 4 2009, 19:05) *
Если, теоретически, структуры могут иметь этот атрибут,
Конечно могут, как и любые другие типы данных. Применение модификатора volatile (также как и const) к структуре распространяет его на все члены структуры.

Цитата(zltigo @ Jan 4 2009, 19:49) *
Проблема в том, что компилятор плюсовый.
Точнее это бага плюсового компилятора. Я все-таки залез в стандарт С++, и вот что он пишет:
Цитата
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. ]


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- demiurg_spb   Вопрос к знатокам С.   Oct 20 2008, 16:04
|- - sergeeff   Цитата(zltigo @ Oct 20 2008, 20:17) Поско...   Oct 21 2008, 15:08
|- - zltigo   Цитата(sonycman @ Jan 4 2009, 18:42) чтоб...   Jan 4 2009, 16:05
|- - zltigo   Цитата(GetSmart @ Jan 4 2009, 20:05) то в...   Jan 4 2009, 17:49
|- - sonycman   Цитата(Сергей Борщ @ Jan 4 2009, 23:00) Т...   Jan 4 2009, 20:18
- - scifi   Спасибо за подсказку. Я, по незнанию, наверное, вс...   Oct 20 2008, 17:27
|- - demiurg_spb   Цитата(scifi @ Oct 20 2008, 21:27) Спасиб...   Oct 20 2008, 18:05
|- - zltigo   Цитата(scifi @ Oct 20 2008, 19:27) ...но ...   Oct 20 2008, 18:17
|- - scifi   Цитата(zltigo @ Oct 20 2008, 22:17) 1.Упо...   Oct 20 2008, 18:35
|- - zltigo   Цитата(scifi @ Oct 20 2008, 20:35) Контрп...   Oct 20 2008, 19:11
|- - scifi   Цитата(zltigo @ Oct 20 2008, 22:17) 1.Упо...   Oct 20 2008, 19:34
|- - demiurg_spb   Цитата(scifi @ Oct 20 2008, 23:34) Я запу...   Oct 20 2008, 19:53
- - zltigo   Цитата(demiurg_spb @ Oct 20 2008, 21:53) ...   Oct 21 2008, 15:57
- - sergeeff   Без финтов - это отлично, но!!! - очен...   Oct 21 2008, 17:01
|- - aaarrr   Цитата(sergeeff @ Oct 21 2008, 21:01) Кол...   Oct 21 2008, 17:06
|- - Сергей Борщ   Цитата(sergeeff @ Oct 21 2008, 20:01) Чте...   Oct 21 2008, 20:38
|- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 22:38) ...   Oct 21 2008, 20:42
||- - Сергей Борщ   Цитата(zltigo @ Oct 21 2008, 23:42) Любой...   Oct 21 2008, 20:46
|- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 22:38) ...   Oct 21 2008, 20:51
||- - Сергей Борщ   Цитата(zltigo @ Oct 21 2008, 23:51) Не ст...   Oct 21 2008, 20:59
|||- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 22:59) ...   Oct 21 2008, 21:19
|||- - demiurg_spb   Попробовал на древнем: Цитата# IAR Atmel AVR C/EC+...   Oct 21 2008, 21:34
|||- - Сергей Борщ   Цитата(zltigo @ Oct 22 2008, 00:19) Это т...   Oct 21 2008, 21:38
|||- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 23:38) ...   Oct 21 2008, 21:53
|||- - Сергей Борщ   Цитата(zltigo @ Oct 22 2008, 00:50) Тем н...   Oct 21 2008, 21:55
|||- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 23:55) ...   Oct 21 2008, 22:02
||- - Непомнящий Евгений   Цитата(zltigo @ Oct 22 2008, 00:51) Одноз...   Oct 22 2008, 04:41
||- - IgorKossak   Цитата(Непомнящий Евгений @ Oct 22 2008, 07...   Oct 22 2008, 05:53
||- - zltigo   Цитата(Непомнящий Евгений @ Oct 22 2008, 06...   Oct 22 2008, 06:40
|- - ReAl   Цитата(Сергей Борщ @ Oct 21 2008, 22:38) ...   Nov 10 2008, 11:49
|- - IgorKossak   Цитата(ReAl @ Nov 10 2008, 13:49) Однако ...   Nov 11 2008, 10:09
||- - ReAl   Цитата(IgorKossak @ Nov 11 2008, 12:09) Т...   Nov 11 2008, 13:17
|- - VladimirYU   Код volatile int x; x ? : x; IAR AVR 4.12 ...   Nov 11 2008, 10:56
|- - aaarrr   Цитата(VladimirYU @ Nov 11 2008, 13:56) К...   Nov 11 2008, 11:13
||- - VladimirYU   Цитата(aaarrr @ Nov 11 2008, 15:13) Можно...   Nov 11 2008, 11:42
||- - aaarrr   Цитата(VladimirYU @ Nov 11 2008, 14:42) В...   Nov 11 2008, 11:43
|||- - VladimirYU   Цитата(aaarrr @ Nov 11 2008, 15:43) Значи...   Nov 11 2008, 11:57
|||- - aaarrr   Цитата(VladimirYU @ Nov 11 2008, 14:57) к...   Nov 11 2008, 12:02
||||- - VladimirYU   Цитата(aaarrr @ Nov 11 2008, 16:02) Листи...   Nov 11 2008, 12:17
|||- - aaarrr   Цитата(VladimirYU @ Nov 11 2008, 14:57) S...   Nov 11 2008, 13:31
|||- - VladimirYU   Цитата(aaarrr @ Nov 11 2008, 16:31) Они т...   Nov 11 2008, 13:43
||||- - aaarrr   Цитата(VladimirYU @ Nov 11 2008, 16:43) Р...   Nov 11 2008, 13:51
|||- - ReAl   Цитата(aaarrr @ Nov 11 2008, 15:31) Они т...   Nov 11 2008, 13:46
||||- - VladimirYU   Цитата(ReAl @ Nov 11 2008, 16:46) Может г...   Nov 11 2008, 13:59
||||- - Сергей Борщ   Цитата(VladimirYU @ Nov 11 2008, 16:59) Т...   Nov 11 2008, 14:05
||||- - aaarrr   Цитата(Сергей Борщ @ Nov 11 2008, 17:05) ...   Nov 11 2008, 14:10
||||- - VladimirYU   Цитата(Сергей Борщ @ Nov 11 2008, 17:05) ...   Nov 11 2008, 14:24
|||- - VladimirYU   Цитата(aaarrr @ Nov 11 2008, 16:31) Они т...   Nov 11 2008, 13:46
||- - ReAl   Цитата(VladimirYU @ Nov 11 2008, 13:42) В...   Nov 11 2008, 13:42
|- - Непомнящий Евгений   Цитата(VladimirYU @ Nov 11 2008, 14:56) К...   Nov 11 2008, 11:23
|- - zltigo   Цитата(Непомнящий Евгений @ Nov 11 2008, 14...   Nov 11 2008, 12:19
|- - aaarrr   Цитата(zltigo @ Nov 11 2008, 15:19) Это в...   Nov 11 2008, 12:22
||- - zltigo   Цитата(aaarrr @ Nov 11 2008, 15:22) Тогда...   Nov 11 2008, 12:27
|- - VladimirYU   Цитата(zltigo @ Nov 11 2008, 16:19) Это в...   Nov 11 2008, 12:26
- - scifi   Итак, итоги: 1) Согласно стандарту языка для чтени...   Oct 21 2008, 17:42
|- - zltigo   Цитата(scifi @ Oct 21 2008, 19:42) Другим...   Oct 21 2008, 17:52
- - ARV   а, простите, разве писать читаемый всеми код - это...   Nov 11 2008, 11:13
|- - aaarrr   Цитата(ARV @ Nov 11 2008, 14:13) Кодuchar...   Nov 11 2008, 11:15
|- - ARV   Цитата(aaarrr @ Nov 11 2008, 14:15) Ворни...   Nov 11 2008, 17:32
|- - aaarrr   Цитата(ARV @ Nov 11 2008, 20:18) возможно...   Nov 11 2008, 17:39
|- - ReAl   Цитата(ARV @ Nov 11 2008, 19:32) возможно...   Nov 11 2008, 18:53
- - aaarrr   RVCT на пропуск операнда ругается.   Nov 11 2008, 12:33
- - ARV   гм... я и не говорил, что пустой if - это норма......   Nov 11 2008, 20:02
|- - defunct   Цитата(ARV @ Nov 11 2008, 22:02) практика...   Dec 25 2008, 00:06
|- - zltigo   Цитата(defunct @ Dec 25 2008, 03:06) С ка...   Dec 25 2008, 08:21
|- - HARMHARM   Цитата(zltigo @ Dec 25 2008, 10:21) Я бы ...   Dec 25 2008, 11:19
||- - zltigo   Цитата(HARMHARM @ Dec 25 2008, 14:19) Код...   Dec 25 2008, 11:42
|- - defunct   Цитата(zltigo @ Dec 25 2008, 10:21) Научи...   Dec 25 2008, 13:29
|- - zltigo   Цитата(defunct @ Dec 25 2008, 16:29) Дума...   Dec 25 2008, 14:06
|- - defunct   Цитата(zltigo @ Dec 25 2008, 16:06) Вопро...   Dec 25 2008, 15:32
|- - Сергей Борщ   Цитата(defunct @ Dec 25 2008, 17:32) if ...   Dec 25 2008, 16:09
|- - defunct   Цитата(Сергей Борщ @ Dec 25 2008, 18:09) ...   Dec 25 2008, 16:24
|- - Сергей Борщ   Цитата(defunct @ Dec 25 2008, 18:24) А пр...   Dec 25 2008, 17:09
|- - defunct   Цитата(Сергей Борщ @ Dec 25 2008, 19:09) ...   Dec 25 2008, 17:21
|- - ARV   Цитата(defunct @ Dec 25 2008, 20:21) Да в...   Dec 27 2008, 13:45
- - ReAl   Если Вам приятно в таком духе - продолжайте, утрир...   Nov 11 2008, 22:04
- - gormih   Обсуждение напоминает обсуждение кода типа Кодuns...   Nov 14 2008, 11:31
- - ARV   хочу для универсализма сделать версию функции prin...   Nov 17 2008, 15:59
|- - Сергей Борщ   Кодvoid printf_7led(char *format, ... ){ ...   Nov 17 2008, 16:24
- - ARV   большое спасибо! я вокруг чего-то похожего бро...   Nov 17 2008, 17:25
|- - ReAl   Цитата(ARV @ Nov 17 2008, 19:25) мне каже...   Dec 11 2008, 08:56
|- - ARV   Цитата(ReAl @ Dec 11 2008, 11:56) Ну избы...   Dec 12 2008, 07:09
|- - zltigo   Цитата(ARV @ Dec 12 2008, 10:09) ...сдела...   Dec 12 2008, 07:15
|- - ARV   Цитата(zltigo @ Dec 12 2008, 10:15) http:...   Dec 13 2008, 11:46
- - sonycman   В оригинальной библиотеке для STM32 квалификатор v...   Jan 4 2009, 18:30
|- - zltigo   Цитата(sonycman @ Jan 4 2009, 21:30) Но, ...   Jan 4 2009, 18:34
- - sergeeff   Я пробовал такое в MS VS2008 для ARM. Данные читаю...   Jan 4 2009, 20:36


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:12
Рейтинг@Mail.ru


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