Отговори на тема  [ 12 мнения ] 
ANSI C, гарантирано прочитане на адрес от паметта. 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение ANSI C, гарантирано прочитане на адрес от паметта.
Въпроса е малко тривиален, ама какъв е гарантирания начин да накараш конпилатора да прочете даден адрес (да изчисти флаг в случая), без да прави нищо друго.

....
(void)SPI->DR;
....

ще работи ли при всички нива на оптимизации и при всички компилатори?

Знам че най сигурно е

int a;
...
a = SPI->DR;
...

Ама това ми се вижда малко глуповато.

П.С въпросния регистър си е дефиниран като volatile предварително.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Фев 14, 2014 3:43 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
Цецо написа:
въпросния регистър си е дефиниран като volatile предварително.


значи щом е volatile всяко негово срещане в сорса генерира достъп (четене/писане според контекста (L-value/R-value)

специално GCC ти го гарантира и може да го оптимизира само ако срещането е в коментари, или функция дето не се вика ;-)


Пет Фев 14, 2014 4:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
най-сигурно си е asm{} :)


Пет Фев 14, 2014 4:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
miro_atc написа:
Цецо написа:
въпросния регистър си е дефиниран като volatile предварително.


значи щом е volatile всяко негово срещане в сорса генерира достъп (четене/писане според контекста (L-value/R-value)

специално GCC ти го гарантира и може да го оптимизира само ако срещането е в коментари, или функция дето не се вика ;-)


Да аз забелязах, че на GCC и SPI->DR; т.е. без (void) отпред също е достатъчно. Предполагам, че и за повечето ембедед компилатори ще е така.

Ама се чудех по ANSI C имали нещо твърдо или е компилатор депендент една такава сентенция. Щото съм срещал всякакви творения из нета.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Фев 14, 2014 4:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
задължително махни (void)...

това може да преебе volatile-a...


Пет Фев 14, 2014 4:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
Абе, че не го преебава... не го преебава, поне на gcc 4.8 :) Но има идея в това което казваш.

Явно няма рецепта.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Фев 14, 2014 4:31 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
И аз като Реконструктура установих че, няма нищо по - сигурно от това да си напишеш asm(...) и каквото ти трябва вътре, че инъче като мине оптимизатора и доста неща "изчезват" от генерирания код.


Пет Фев 14, 2014 5:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
И аз ползвам този начин:

SPI->DR;

При всички нива на оптимизации без проблем гарантирано за arm-none-eabi-gcc.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Пет Фев 14, 2014 6:14 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 12, 2011 9:21 pm
Мнения: 62
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
SPI->DR;

би трябвало да работи... току що си загубих половин час да ровя в последния стандарт http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf, за да разбера какво би трябвало да е гарантирано в такъв случай, но то C-стандарта не е като едновремещните C стандарти (какви C стандарти имаше едно време...) - сега на човек му трябва юридическо образование, за да го разбере... абе добре е все още - само 700 страници са, от които реално под 200 са за самия език; за сравнение, това, което намерих за C++ - са около 1300 страници, което ме шокира - на мастит език като C++ би трябвало, си мисля, да му е поне 3000 страници стандарта... както е казал поетът - 'я, какъв голям мафиот, а с каква малка пишка'

в случая насилствената смяна на типа с (void) просто няма смисъл - синтактично е правилна, но няма смисъл

@Цецо

SPI->DR;

ще работи, със сигурност - майната му на стандарта, една много проста причина ще дам - виждал съм достатъчно комерсиален код, който ползва точно твоята конструкция, за точно твоята цел (в интерес на истината, почти всичко, което съм виждал, е било с '(void)' отпред, явно е някак си романтично така да се пише); ако производителите на компилатори променят това поведение - жална им майка... да речем, че който плаща - той поръчва музиката

за протокола прилагам някои остроумни извадки от стандарта, докато се рових:

------------------------------------------------------------------

5.1.2.3 Program execution
1 The semantic descriptions in this International Standard describe the behavior of an
abstract machine in which issues of optimization are irrelevant.
...
2 Accessing a volatile object, modifying an object, modifying a file, or calling a function
that does any of those operations are all side effects, 12) which are changes in the state of
the execution environment. Evaluation of an expression in general includes both value
computations and initiation of side effects. Value computation for an lvalue expression
includes determining the identity of the designated object.
...
6 The least requirements on a conforming implementation are:
— Accesses to volatile objects are evaluated strictly according to the rules of the abstract
machine....
...
3 An assignment operator stores a value in the object designated by the left operand. An
assignment expression has the value of the left operand after the assignment, 111) but is not
an lvalue. The type of an assignment expression is the type the left operand would have
after lvalue conversion. The side effect of updating the stored value of the left operand is
sequenced after the value computations of the left and right operands. The evaluations of
the operands are unsequenced.
...
111) The implementation is permitted to read the object to determine the value but is not required to, even
when the object has volatile-qualified type.
...
7 An object that has volatile-qualified type may be modified in ways unknown to the
implementation or have other unknown side effects. Therefore any expression referring
to such an object shall be evaluated strictly according to the rules of the abstract machine,
as described in 5.1.2.3. Furthermore, at every sequence point the value last stored in the
object shall agree with that prescribed by the abstract machine, except as modified by the
unknown factors mentioned previously. 134) What constitutes an access to an object that
has volatile-qualified type is implementation-defined.
...
134) A volatile declaration may be used to describe an object corresponding to a memory-mapped
input/output port or an object accessed by an asynchronously interrupting function. Actions on
objects so declared shall not be ‘‘optimized out’’ by an implementation or reordered except as
permitted by the rules for evaluating expressions.

------------------------------------------------------------------

не ми стигнаха нервите, да търся какви са точно правилата за изчисление на изрази...


Пет Фев 14, 2014 10:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
Ама и писанки. :)

"void" в случая е само наследство да не дава warning, понеже следното са легални конструции:

Код:
123;
(void)456;


Предупреждението е за израз без страничен ефект (когато няма volatile вътре).

Някъде/някога беше решено че израз cast-нат до void не трябва да дава warning. В случая с volatile може и да се пропуска.


Пет Фев 14, 2014 11:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
Цецо написа:
Абе, че не го преебава... не го преебава, поне на gcc 4.8 :) Но има идея в това което казваш.

Явно няма рецепта.


Няма защото "->" има приоритет пред тайпкаста, т.е. имаш volatile указател, от който се извлича някаква стойност от тип int, който ти кастваш до void. И вълкът сит и агнето цяло ;-)


По-горе колегата е цитирал стандарта, последната точка пише черно на бяло, че действията с volatile типове не могат нито да се спестяват, нито да им се променя последователността. В случай че последователността не е ясна GCC те предупреждава ;-)

А с кастванията пак ти казвам, не ги прави ако не си сигурен че трябва ;-) Действително се слага каст до войд, за да няма предупреждения за излишен израз, обаче ако ти даде това предупреждение значи си забравил volatile-a...


Съб Фев 15, 2014 1:17 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: ANSI C, гарантирано прочитане на адрес от паметта.
Мерси. Спах спокойно :)

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Съб Фев 15, 2014 9:51 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни