<?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: make usb code work with optimizations (ie. -O2) in LPCXpresso IDE</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527855#M671</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by domen on Wed May 12 04:29:15 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;And this is what I needed to get usbcdc working:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If not volatile, the while (buffer_empty..) loop optimizes to a nice while (1) &lt;SPAN class="lia-unicode-emoji" title=":face_with_tongue:"&gt;&lt;LI-EMOJI id="lia_face-with-tongue" title=":face_with_tongue:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
Index: usbcore.c
===================================================================
--- usbcore.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ usbcore.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -61,7 +61,7 @@
 
 uint16_t&amp;nbsp; USB_DeviceStatus;
 uint8_t&amp;nbsp; USB_DeviceAddress;
-uint8_t&amp;nbsp; USB_Configuration;
+volatile uint8_t&amp;nbsp; USB_Configuration;
 uint32_t USB_EndPointMask;
 uint32_t USB_EndPointHalt;
 uint32_t USB_EndPointStall;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* EP must stay stalled */
@@ -374,7 +374,7 @@
 
&amp;nbsp;&amp;nbsp; switch (SetupPacket.bmRequestType.BM.Recipient) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case REQUEST_TO_DEVICE:
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EP0Data.pData = &amp;amp;USB_Configuration;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EP0Data.pData = (uint8_t *)&amp;amp;USB_Configuration;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (FALSE);
Index: usbcore.h
===================================================================
--- usbcore.h&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ usbcore.h&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -29,7 +29,7 @@
 /* USB Core Global Variables */
 extern uint16_t USB_DeviceStatus;
 extern uint8_t&amp;nbsp; USB_DeviceAddress;
-extern uint8_t&amp;nbsp; USB_Configuration;
+extern volatile uint8_t&amp;nbsp; USB_Configuration;
 extern uint32_t USB_EndPointMask;
 extern uint32_t USB_EndPointHalt;
 extern uint32_t USB_EndPointStall;
Index: serial.c
===================================================================
--- serial.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ serial.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -35,8 +35,8 @@
 // buffer type
 typedef struct __SER_BUF_T {
&amp;nbsp;&amp;nbsp; unsigned char data[SER_BUF_SIZE];
-&amp;nbsp; unsigned int wrIdx;
-&amp;nbsp; unsigned int rdIdx;
+&amp;nbsp; volatile unsigned int wrIdx;
+&amp;nbsp; volatile unsigned int rdIdx;
 } SER_BUF_T;
 
 unsigned long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ser_txRestart;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NZ if TX restart is required
Index: cdcuser.c
===================================================================
--- cdcuser.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ cdcuser.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -56,8 +56,8 @@
 // CDC output buffer
 typedef struct __CDC_BUF_T {
&amp;nbsp;&amp;nbsp; unsigned char data[CDC_BUF_SIZE];
-&amp;nbsp; unsigned int wrIdx;
-&amp;nbsp; unsigned int rdIdx;
+&amp;nbsp; volatile unsigned int wrIdx;
+&amp;nbsp; volatile unsigned int rdIdx;
 } CDC_BUF_T;
 
 CDC_BUF_T&amp;nbsp; CDC_OutBuf;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // buffer for all CDC Out data
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 16 Jun 2016 01:35:40 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-16T01:35:40Z</dc:date>
    <item>
      <title>make usb code work with optimizations (ie. -O2)</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527852#M668</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by domen on Tue May 11 08:54:55 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Basically it's two changes.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;First one fails because UsbAddPtr gets inlined, and pD is not reloaded when pD-&amp;gt;length is checked on next loop iteration (not sure if this is actually a compiler bug, or a valid "optimization").&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Second one is deffinitely a code bug, volatile should be used, so code isn't optimized away. And even then... who makes delays with C LOOPS?!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
Index: usbcore.c
===================================================================
--- usbcore.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 353)
+++ usbcore.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -394,32 +394,6 @@
 
 
 /*
- * Add a number of bytes to a pointer's address
- * Harder than you might think. Some compilers say:
- * Expected an lvalue&amp;nbsp; -- Assignment expects its first operand to be
- * an lvalue.&amp;nbsp; Please note that a cast removes the lvaluedness of an
- * expression.
- *
- * vpptr = void pointer to pointer
- * n = number of bytes to add to pointer
- * Call looks like: AddPtr((void **)&amp;amp;myPointer, 8);
- */
-
-__inline void UsbAddPtr(void **vpptr, uint32_t n)
-{
-&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Declare a pointer to a pointer to a byte. Only a byte pointer
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * can be incremented by a number of bytes. Other pointers will
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * increment by a multiple of what they point to.
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */
-&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t **bpptr;
-
-&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Convert our void pointer to a pointer to a byte pointer to a pointer */
-&amp;nbsp;&amp;nbsp;&amp;nbsp; bpptr = (uint8_t **)vpptr;
-
-&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Add 'n' bytes to our pointer value */
-&amp;nbsp;&amp;nbsp;&amp;nbsp; (*bpptr) += n;
-}
-/*
&amp;nbsp; *&amp;nbsp; Set Configuration USB Request
&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp; Parameters:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; None (global SetupPacket)
&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp; Return Value:&amp;nbsp;&amp;nbsp;&amp;nbsp; TRUE - Success, FALSE - Error
@@ -462,7 +436,10 @@
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_DeviceStatus &amp;amp;= ~USB_GETSTATUS_SELF_POWERED;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsbAddPtr((void **)&amp;amp;pD, ((USB_CONFIGURATION_DESCRIPTOR *)pD)-&amp;gt;wTotalLength);
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* increment pointer */
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t *tmp = (void*)pD;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)-&amp;gt;wTotalLength;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pD = (void*)tmp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
@@ -480,7 +457,10 @@
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsbAddPtr((void **)&amp;amp;pD, pD-&amp;gt;bLength);
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* increment pointer */
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t *tmp = (void*)pD;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tmp += pD-&amp;gt;bLength;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pD = (void*)tmp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {
@@ -554,7 +534,10 @@
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (pD-&amp;gt;bDescriptorType) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case USB_CONFIGURATION_DESCRIPTOR_TYPE:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((USB_CONFIGURATION_DESCRIPTOR *)pD)-&amp;gt;bConfigurationValue != USB_Configuration) {
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsbAddPtr((void **)&amp;amp;pD, ((USB_CONFIGURATION_DESCRIPTOR *)pD)-&amp;gt;wTotalLength);
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* increment pointer */
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t *tmp = (void*)pD;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)-&amp;gt;wTotalLength;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pD = (void*)tmp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
@@ -588,7 +571,10 @@
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsbAddPtr((void **)&amp;amp;pD, pD-&amp;gt;bLength);
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* increment pointer */
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t *tmp = (void*)pD;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tmp += pD-&amp;gt;bLength;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pD = (void*)tmp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:
Index: usbhw.c
===================================================================
--- usbhw.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 353)
+++ usbhw.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -90,7 +90,7 @@
&amp;nbsp; */
 
 void delay (uint32_t length ) {
-&amp;nbsp; uint32_t i;
+&amp;nbsp; volatile uint32_t i;
 
&amp;nbsp;&amp;nbsp; for ( i = 0; i &amp;lt; length; i++ );
&amp;nbsp;&amp;nbsp; return;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 01:35:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527852#M668</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T01:35:38Z</dc:date>
    </item>
    <item>
      <title>Re: make usb code work with optimizations (ie. -O2)</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527853#M669</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by NXP_USA on Tue May 11 13:51:15 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: domen&lt;/STRONG&gt;&lt;BR /&gt;Basically it's two changes.&lt;BR /&gt;First one fails because UsbAddPtr gets inlined, and pD is not reloaded when pD-&amp;gt;length is checked on next loop iteration (not sure if this is actually a compiler bug, or a valid "optimization").&lt;BR /&gt;&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Try this change- it should take care of the optimization problems.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
__inline void UsbAddPtr(void **vpptr, const uint32_t n)
{
/* Declare a pointer to a pointer to a byte. Only a byte pointer
 * can be incremented by a number of bytes. Other pointers will
 * increment by a multiple of what they point to.
 */
volatile uint8_t **bpptr;

/* Convert our void pointer to a pointer to a byte pointer to a pointer */
bpptr = (volatile uint8_t **)vpptr;

/* Add 'n' bytes to our pointer value */
(*bpptr) += n;
}

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 01:35:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527853#M669</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T01:35:39Z</dc:date>
    </item>
    <item>
      <title>Re: make usb code work with optimizations (ie. -O2)</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527854#M670</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by domen on Tue May 11 15:18:53 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Yeah, lets complicate already too complicated piece of code :P&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I like my version better. Don't care what gets included.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 01:35:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527854#M670</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T01:35:39Z</dc:date>
    </item>
    <item>
      <title>Re: make usb code work with optimizations (ie. -O2)</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527855#M671</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by domen on Wed May 12 04:29:15 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;And this is what I needed to get usbcdc working:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If not volatile, the while (buffer_empty..) loop optimizes to a nice while (1) &lt;SPAN class="lia-unicode-emoji" title=":face_with_tongue:"&gt;&lt;LI-EMOJI id="lia_face-with-tongue" title=":face_with_tongue:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
Index: usbcore.c
===================================================================
--- usbcore.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ usbcore.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -61,7 +61,7 @@
 
 uint16_t&amp;nbsp; USB_DeviceStatus;
 uint8_t&amp;nbsp; USB_DeviceAddress;
-uint8_t&amp;nbsp; USB_Configuration;
+volatile uint8_t&amp;nbsp; USB_Configuration;
 uint32_t USB_EndPointMask;
 uint32_t USB_EndPointHalt;
 uint32_t USB_EndPointStall;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* EP must stay stalled */
@@ -374,7 +374,7 @@
 
&amp;nbsp;&amp;nbsp; switch (SetupPacket.bmRequestType.BM.Recipient) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case REQUEST_TO_DEVICE:
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EP0Data.pData = &amp;amp;USB_Configuration;
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EP0Data.pData = (uint8_t *)&amp;amp;USB_Configuration;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (FALSE);
Index: usbcore.h
===================================================================
--- usbcore.h&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ usbcore.h&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -29,7 +29,7 @@
 /* USB Core Global Variables */
 extern uint16_t USB_DeviceStatus;
 extern uint8_t&amp;nbsp; USB_DeviceAddress;
-extern uint8_t&amp;nbsp; USB_Configuration;
+extern volatile uint8_t&amp;nbsp; USB_Configuration;
 extern uint32_t USB_EndPointMask;
 extern uint32_t USB_EndPointHalt;
 extern uint32_t USB_EndPointStall;
Index: serial.c
===================================================================
--- serial.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ serial.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -35,8 +35,8 @@
 // buffer type
 typedef struct __SER_BUF_T {
&amp;nbsp;&amp;nbsp; unsigned char data[SER_BUF_SIZE];
-&amp;nbsp; unsigned int wrIdx;
-&amp;nbsp; unsigned int rdIdx;
+&amp;nbsp; volatile unsigned int wrIdx;
+&amp;nbsp; volatile unsigned int rdIdx;
 } SER_BUF_T;
 
 unsigned long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ser_txRestart;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NZ if TX restart is required
Index: cdcuser.c
===================================================================
--- cdcuser.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (revision 356)
+++ cdcuser.c&amp;nbsp;&amp;nbsp;&amp;nbsp; (working copy)
@@ -56,8 +56,8 @@
 // CDC output buffer
 typedef struct __CDC_BUF_T {
&amp;nbsp;&amp;nbsp; unsigned char data[CDC_BUF_SIZE];
-&amp;nbsp; unsigned int wrIdx;
-&amp;nbsp; unsigned int rdIdx;
+&amp;nbsp; volatile unsigned int wrIdx;
+&amp;nbsp; volatile unsigned int rdIdx;
 } CDC_BUF_T;
 
 CDC_BUF_T&amp;nbsp; CDC_OutBuf;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // buffer for all CDC Out data
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 01:35:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/make-usb-code-work-with-optimizations-ie-O2/m-p/527855#M671</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T01:35:40Z</dc:date>
    </item>
  </channel>
</rss>

