<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: volatile preventing ldrb byte access? in LPCXpresso IDE</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE/volatile-preventing-ldrb-byte-access/m-p/545095#M9042</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by lpcxpresso-support on Tue Mar 18 00:56:18 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Try adding the option "&lt;/SPAN&gt;&lt;STRONG&gt;-fno-strict-volatile-bitfields&lt;/STRONG&gt;&lt;SPAN&gt;" to the compiler options&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Project -&amp;gt; Properties -&amp;gt; C/C++ Build -&amp;gt; Settings -&amp;gt; Tool Settings …&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;… -&amp;gt; MCU C Compiler -&amp;gt; Optimization -&amp;gt; Other optimization flags.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does this cause the LDRB to be generated instead of the LDR?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPCXpresso Support&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 16 Jun 2016 00:33:45 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-16T00:33:45Z</dc:date>
    <item>
      <title>volatile preventing ldrb byte access?</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/volatile-preventing-ldrb-byte-access/m-p/545094#M9041</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by cyberstudio on Mon Mar 17 17:58:09 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I am using the GPIO "byte access" registers available on some LPC microcontrollers. The LPCOpen library defines those as:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
typedef struct {/*!&amp;lt; GPIO_PORT Structure */
__IO uint8_t B[128][32];/*!&amp;lt; Offset 0x0000: Byte pin registers ports 0 to n; pins PIOn_0 to PIOn_31 */
......&amp;lt;snip&amp;gt;......
} LPC_GPIO_T;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I would expect the ARM byte access instruction would be used to read the port pin, but the generated code for checking if PIO0_14 pin is zero looked like:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
23a0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; movsr3, #160; 0xa0
05db&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lslsr3, r3, #23
68db&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldrr3, [r3, #12]
021b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lslsr3, r3, #8
0e1b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lsrsr3, r3, #24
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The strangest thing is, if I remove "_IO" from the struct definition, which was defined to be "volatile", the code generated becomes:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
23a0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; movsr3, #160; 0xa0
05db&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lslsr3, r3, #23
7b9b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldrbr3, [r3, #14]
2b00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmpr3, #0
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My optimization flag is -Os. My LPCXpresso verion is 7.0.2. This is confounding, as why would a volatile byte turn into a 32-bit word? From an optimization standpoint, one cmp instruction is clearly cheaper than 2 shift instructions, both in space and in time.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 00:33:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/volatile-preventing-ldrb-byte-access/m-p/545094#M9041</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T00:33:44Z</dc:date>
    </item>
    <item>
      <title>Re: volatile preventing ldrb byte access?</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/volatile-preventing-ldrb-byte-access/m-p/545095#M9042</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by lpcxpresso-support on Tue Mar 18 00:56:18 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Try adding the option "&lt;/SPAN&gt;&lt;STRONG&gt;-fno-strict-volatile-bitfields&lt;/STRONG&gt;&lt;SPAN&gt;" to the compiler options&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Project -&amp;gt; Properties -&amp;gt; C/C++ Build -&amp;gt; Settings -&amp;gt; Tool Settings …&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;… -&amp;gt; MCU C Compiler -&amp;gt; Optimization -&amp;gt; Other optimization flags.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does this cause the LDRB to be generated instead of the LDR?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPCXpresso Support&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 00:33:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/volatile-preventing-ldrb-byte-access/m-p/545095#M9042</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T00:33:45Z</dc:date>
    </item>
  </channel>
</rss>

