You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
7.2KB

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2020 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  20. <title>Volatiles (Using the GNU Compiler Collection (GCC))</title>
  21. <meta name="description" content="Volatiles (Using the GNU Compiler Collection (GCC))">
  22. <meta name="keywords" content="Volatiles (Using the GNU Compiler Collection (GCC))">
  23. <meta name="resource-type" content="document">
  24. <meta name="distribution" content="global">
  25. <meta name="Generator" content="makeinfo">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="C-Extensions.html#C-Extensions" rel="up" title="C Extensions">
  30. <link href="Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C" rel="next" title="Using Assembly Language with C">
  31. <link href="Inline.html#Inline" rel="prev" title="Inline">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.indentedblock {margin-right: 0em}
  36. blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
  37. blockquote.smallquotation {font-size: smaller}
  38. div.display {margin-left: 3.2em}
  39. div.example {margin-left: 3.2em}
  40. div.lisp {margin-left: 3.2em}
  41. div.smalldisplay {margin-left: 3.2em}
  42. div.smallexample {margin-left: 3.2em}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style: oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nolinebreak {white-space: nowrap}
  54. span.roman {font-family: initial; font-weight: normal}
  55. span.sansserif {font-family: sans-serif; font-weight: normal}
  56. ul.no-bullet {list-style: none}
  57. -->
  58. </style>
  59. </head>
  60. <body lang="en">
  61. <a name="Volatiles"></a>
  62. <div class="header">
  63. <p>
  64. Next: <a href="Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C" accesskey="n" rel="next">Using Assembly Language with C</a>, Previous: <a href="Inline.html#Inline" accesskey="p" rel="prev">Inline</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  65. </div>
  66. <hr>
  67. <a name="When-is-a-Volatile-Object-Accessed_003f"></a>
  68. <h3 class="section">6.46 When is a Volatile Object Accessed?</h3>
  69. <a name="index-accessing-volatiles"></a>
  70. <a name="index-volatile-read"></a>
  71. <a name="index-volatile-write"></a>
  72. <a name="index-volatile-access"></a>
  73. <p>C has the concept of volatile objects. These are normally accessed by
  74. pointers and used for accessing hardware or inter-thread
  75. communication. The standard encourages compilers to refrain from
  76. optimizations concerning accesses to volatile objects, but leaves it
  77. implementation defined as to what constitutes a volatile access. The
  78. minimum requirement is that at a sequence point all previous accesses
  79. to volatile objects have stabilized and no subsequent accesses have
  80. occurred. Thus an implementation is free to reorder and combine
  81. volatile accesses that occur between sequence points, but cannot do
  82. so for accesses across a sequence point. The use of volatile does
  83. not allow you to violate the restriction on updating objects multiple
  84. times between two sequence points.
  85. </p>
  86. <p>Accesses to non-volatile objects are not ordered with respect to
  87. volatile accesses. You cannot use a volatile object as a memory
  88. barrier to order a sequence of writes to non-volatile memory. For
  89. instance:
  90. </p>
  91. <div class="smallexample">
  92. <pre class="smallexample">int *ptr = <var>something</var>;
  93. volatile int vobj;
  94. *ptr = <var>something</var>;
  95. vobj = 1;
  96. </pre></div>
  97. <p>Unless <var>*ptr</var> and <var>vobj</var> can be aliased, it is not guaranteed
  98. that the write to <var>*ptr</var> occurs by the time the update
  99. of <var>vobj</var> happens. If you need this guarantee, you must use
  100. a stronger memory barrier such as:
  101. </p>
  102. <div class="smallexample">
  103. <pre class="smallexample">int *ptr = <var>something</var>;
  104. volatile int vobj;
  105. *ptr = <var>something</var>;
  106. asm volatile (&quot;&quot; : : : &quot;memory&quot;);
  107. vobj = 1;
  108. </pre></div>
  109. <p>A scalar volatile object is read when it is accessed in a void context:
  110. </p>
  111. <div class="smallexample">
  112. <pre class="smallexample">volatile int *src = <var>somevalue</var>;
  113. *src;
  114. </pre></div>
  115. <p>Such expressions are rvalues, and GCC implements this as a
  116. read of the volatile object being pointed to.
  117. </p>
  118. <p>Assignments are also expressions and have an rvalue. However when
  119. assigning to a scalar volatile, the volatile object is not reread,
  120. regardless of whether the assignment expression&rsquo;s rvalue is used or
  121. not. If the assignment&rsquo;s rvalue is used, the value is that assigned
  122. to the volatile object. For instance, there is no read of <var>vobj</var>
  123. in all the following cases:
  124. </p>
  125. <div class="smallexample">
  126. <pre class="smallexample">int obj;
  127. volatile int vobj;
  128. vobj = <var>something</var>;
  129. obj = vobj = <var>something</var>;
  130. obj ? vobj = <var>onething</var> : vobj = <var>anotherthing</var>;
  131. obj = (<var>something</var>, vobj = <var>anotherthing</var>);
  132. </pre></div>
  133. <p>If you need to read the volatile object after an assignment has
  134. occurred, you must use a separate expression with an intervening
  135. sequence point.
  136. </p>
  137. <p>As bit-fields are not individually addressable, volatile bit-fields may
  138. be implicitly read when written to, or when adjacent bit-fields are
  139. accessed. Bit-field operations may be optimized such that adjacent
  140. bit-fields are only partially accessed, if they straddle a storage unit
  141. boundary. For these reasons it is unwise to use volatile bit-fields to
  142. access hardware.
  143. </p>
  144. <hr>
  145. <div class="header">
  146. <p>
  147. Next: <a href="Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C" accesskey="n" rel="next">Using Assembly Language with C</a>, Previous: <a href="Inline.html#Inline" accesskey="p" rel="prev">Inline</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  148. </div>
  149. </body>
  150. </html>