|
Вопрос к знатокам С. |
|
|
|
Oct 20 2008, 16:04
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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;
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
 |
Ответов
|
Jan 4 2009, 11:12
|

Любитель
    
Группа: Свой
Сообщений: 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; } Как убрать предупреждение компилятора, и обойтись без явной временной переменной?
|
|
|
|
|
Jan 4 2009, 14:31
|

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

|
Цитата(sonycman @ Jan 4 2009, 14:12)  Как убрать предупреждение компилятора, и обойтись без явной временной переменной? Что-то я совсем не понял, что и как Вы собственно написали  . А вообще так: Код 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
|
|
|
|
|
Jan 4 2009, 15:42
|

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

|
Цитата(zltigo @ Jan 4 2009, 18:31)  Что-то я совсем не понял, что и как Вы собственно написали  . А вообще так... P.S. И вместо мути в структуре ввиде 'reserved' используйте 32bit паковку. Так эта муть - библиотека ST для STM32. Я из неё использую только определения регистров. Ну её нафиг переделывать, и так пришлось править, чтобы хидеры из C++ компилировались... Попробовал, как Вы подсказали: Код 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 и выкидывает из кода эту строку...
|
|
|
|
|
Jan 4 2009, 16:22
|
.
     
Группа: Участник
Сообщений: 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 и выкидывает из кода эту строку...  Впервые вижу волатильную структуру  Может я ошибаюсь, но только переменная может иметь этот атрибут. Попробуйте объявить так: Код (volatile I2C_Type_Def *)(0x40000000 + 0x5800)->SR2; Потом проверьте есть ли в листинге чтение этого регистра. Я написал без временной переменной, но если она нужна или надо делать несколько чтений, то можно так: Код volatile I2C_Type_Def * I2C2_1 = (volatile I2C_Type_Def *)(0x40000000 + 0x5800);
I2C2_1->SR2;
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 4 2009, 16:27
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 4 2009, 17:05
|
.
     
Группа: Участник
Сообщений: 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 так это совсем другое.... Не, не. Я правильно выразил свою мысль в коде  <<volatile I2C_Type_Def *>> говорит, что там, по адресу будет лежать волатильная структура/переменная. Переменная с адресом (I2C2_1) не должна/обязана быть волатильной. Разглядывая чужие хидеры, например из ИАРа, я ни разу не встречал волатил при объявлении структур, а вот при объявлении переменных - всегда. Поэтому и удивился. Если, теоретически, структуры могут иметь этот атрибут, то возможно проблема у sonycman-а в том, что компилятор не учитывает волатил из структуры, но будет учитывать при непосредственном объявлении в переменной. Проверить-то легко.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 4 2009, 19:00
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|