• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/toolchains/hndtools-armeabi-2013.11/share/doc/arm-arm-none-eabi/html/gcc/
1<html lang="en">
2<head>
3<title>Volatiles - Using the GNU Compiler Collection (GCC)</title>
4<meta http-equiv="Content-Type" content="text/html">
5<meta name="description" content="Using the GNU Compiler Collection (GCC)">
6<meta name="generator" content="makeinfo 4.13">
7<link title="Top" rel="start" href="index.html#Top">
8<link rel="up" href="C-Extensions.html#C-Extensions" title="C Extensions">
9<link rel="prev" href="Inline.html#Inline" title="Inline">
10<link rel="next" href="Extended-Asm.html#Extended-Asm" title="Extended Asm">
11<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
12<!--
13Copyright (C) 1988-2013 Free Software Foundation, Inc.
14
15Permission is granted to copy, distribute and/or modify this document
16under the terms of the GNU Free Documentation License, Version 1.3 or
17any later version published by the Free Software Foundation; with the
18Invariant Sections being ``Funding Free Software'', the Front-Cover
19Texts being (a) (see below), and with the Back-Cover Texts being (b)
20(see below).  A copy of the license is included in the section entitled
21``GNU Free Documentation License''.
22
23(a) The FSF's Front-Cover Text is:
24
25     A GNU Manual
26
27(b) The FSF's Back-Cover Text is:
28
29     You have freedom to copy and modify this GNU Manual, like GNU
30     software.  Copies published by the Free Software Foundation raise
31     funds for GNU development.-->
32<meta http-equiv="Content-Style-Type" content="text/css">
33<style type="text/css"><!--
34  pre.display { font-family:inherit }
35  pre.format  { font-family:inherit }
36  pre.smalldisplay { font-family:inherit; font-size:smaller }
37  pre.smallformat  { font-family:inherit; font-size:smaller }
38  pre.smallexample { font-size:smaller }
39  pre.smalllisp    { font-size:smaller }
40  span.sc    { font-variant:small-caps }
41  span.roman { font-family:serif; font-weight:normal; } 
42  span.sansserif { font-family:sans-serif; font-weight:normal; } 
43--></style>
44<link rel="stylesheet" type="text/css" href="../cs.css">
45</head>
46<body>
47<div class="node">
48<a name="Volatiles"></a>
49<p>
50Next:&nbsp;<a rel="next" accesskey="n" href="Extended-Asm.html#Extended-Asm">Extended Asm</a>,
51Previous:&nbsp;<a rel="previous" accesskey="p" href="Inline.html#Inline">Inline</a>,
52Up:&nbsp;<a rel="up" accesskey="u" href="C-Extensions.html#C-Extensions">C Extensions</a>
53<hr>
54</div>
55
56<h3 class="section">6.40 When is a Volatile Object Accessed?</h3>
57
58<p><a name="index-accessing-volatiles-2819"></a><a name="index-volatile-read-2820"></a><a name="index-volatile-write-2821"></a><a name="index-volatile-access-2822"></a>
59C has the concept of volatile objects.  These are normally accessed by
60pointers and used for accessing hardware or inter-thread
61communication.  The standard encourages compilers to refrain from
62optimizations concerning accesses to volatile objects, but leaves it
63implementation defined as to what constitutes a volatile access.  The
64minimum requirement is that at a sequence point all previous accesses
65to volatile objects have stabilized and no subsequent accesses have
66occurred.  Thus an implementation is free to reorder and combine
67volatile accesses that occur between sequence points, but cannot do
68so for accesses across a sequence point.  The use of volatile does
69not allow you to violate the restriction on updating objects multiple
70times between two sequence points.
71
72 <p>Accesses to non-volatile objects are not ordered with respect to
73volatile accesses.  You cannot use a volatile object as a memory
74barrier to order a sequence of writes to non-volatile memory.  For
75instance:
76
77<pre class="smallexample">     int *ptr = <var>something</var>;
78     volatile int vobj;
79     *ptr = <var>something</var>;
80     vobj = 1;
81</pre>
82 <p class="noindent">Unless <var>*ptr</var> and <var>vobj</var> can be aliased, it is not guaranteed
83that the write to <var>*ptr</var> occurs by the time the update
84of <var>vobj</var> happens.  If you need this guarantee, you must use
85a stronger memory barrier such as:
86
87<pre class="smallexample">     int *ptr = <var>something</var>;
88     volatile int vobj;
89     *ptr = <var>something</var>;
90     asm volatile ("" : : : "memory");
91     vobj = 1;
92</pre>
93 <p>A scalar volatile object is read when it is accessed in a void context:
94
95<pre class="smallexample">     volatile int *src = <var>somevalue</var>;
96     *src;
97</pre>
98 <p>Such expressions are rvalues, and GCC implements this as a
99read of the volatile object being pointed to.
100
101 <p>Assignments are also expressions and have an rvalue.  However when
102assigning to a scalar volatile, the volatile object is not reread,
103regardless of whether the assignment expression's rvalue is used or
104not.  If the assignment's rvalue is used, the value is that assigned
105to the volatile object.  For instance, there is no read of <var>vobj</var>
106in all the following cases:
107
108<pre class="smallexample">     int obj;
109     volatile int vobj;
110     vobj = <var>something</var>;
111     obj = vobj = <var>something</var>;
112     obj ? vobj = <var>onething</var> : vobj = <var>anotherthing</var>;
113     obj = (<var>something</var>, vobj = <var>anotherthing</var>);
114</pre>
115 <p>If you need to read the volatile object after an assignment has
116occurred, you must use a separate expression with an intervening
117sequence point.
118
119 <p>As bit-fields are not individually addressable, volatile bit-fields may
120be implicitly read when written to, or when adjacent bit-fields are
121accessed.  Bit-field operations may be optimized such that adjacent
122bit-fields are only partially accessed, if they straddle a storage unit
123boundary.  For these reasons it is unwise to use volatile bit-fields to
124access hardware.
125
126 </body></html>
127
128