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

 
 
> Вопрос к знатокам С.
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
zltigo
сообщение Jan 4 2009, 17:49
Сообщение #9


Гуру
******

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



Цитата(GetSmart @ Jan 4 2009, 20:05) *
то возможно проблема у sonycman-а в том...

Проблема в том, что компилятор плюсовый.


Цитата(GetSmart @ Jan 4 2009, 20:05) *
<<volatile I2C_Type_Def *>> говорит, что там, по адресу будет лежать волатильная структура...

Угу, только почему-то буквально строчкой выше Вы выражали сомнение в возможности описания таких структур smile.gif. О чем речь я и завел.


--------------------
Feci, quod potui, faciant meliora potentes
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
|- - Сергей Борщ   Цитата(GetSmart @ Jan 4 2009, 19:05) Если...   Jan 4 2009, 19:00
|- - 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
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


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


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