<?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 Ring buffer size must be power of 2 in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586285#M21406</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by kmdewaal on Thu Aug 06 08:19:24 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;The ring buffer code in lpc_chip_43xx/src/ring_buffer.c only works correct if the buffer size is a power of 2.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The reason for this is the way the position of the head and the tail of the ring buffer are computed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This is done with a logical AND computation in the following macro's:&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;#define RB_INDH(rb)&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; ((rb)-&amp;gt;head &amp;amp; ((rb)-&amp;gt;count - 1))
#define RB_INDT(rb)&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; ((rb)-&amp;gt;tail &amp;amp; ((rb)-&amp;gt;count - 1))
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;When the ring buffer size is a power of 2 this is fast way of computing the modulus.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;However, this does NOT work when the buffer size is NOT a power of 2.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Instead of a logcal AND it is better to do a modulo computation that works with all buffer sizes:&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;#define RB_INDH(rb)&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; ((rb)-&amp;gt;head % (rb)-&amp;gt;count)
#define RB_INDT(rb)&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; ((rb)-&amp;gt;tail % (rb)-&amp;gt;count)
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Note that the logical AND computation can be faster, depending on the processor. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 20:25:13 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T20:25:13Z</dc:date>
    <item>
      <title>Ring buffer size must be power of 2</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586285#M21406</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by kmdewaal on Thu Aug 06 08:19:24 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;The ring buffer code in lpc_chip_43xx/src/ring_buffer.c only works correct if the buffer size is a power of 2.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The reason for this is the way the position of the head and the tail of the ring buffer are computed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This is done with a logical AND computation in the following macro's:&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;#define RB_INDH(rb)&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; ((rb)-&amp;gt;head &amp;amp; ((rb)-&amp;gt;count - 1))
#define RB_INDT(rb)&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; ((rb)-&amp;gt;tail &amp;amp; ((rb)-&amp;gt;count - 1))
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;When the ring buffer size is a power of 2 this is fast way of computing the modulus.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;However, this does NOT work when the buffer size is NOT a power of 2.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Instead of a logcal AND it is better to do a modulo computation that works with all buffer sizes:&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;#define RB_INDH(rb)&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; ((rb)-&amp;gt;head % (rb)-&amp;gt;count)
#define RB_INDT(rb)&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; ((rb)-&amp;gt;tail % (rb)-&amp;gt;count)
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Note that the logical AND computation can be faster, depending on the processor. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:25:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586285#M21406</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:25:13Z</dc:date>
    </item>
    <item>
      <title>Re: Ring buffer size must be power of 2</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586286#M21407</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by kmdewaal on Fri Aug 07 01:04:55 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Correction: it is of course a bitwise AND, not a logical AND.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:25:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586286#M21407</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:25:14Z</dc:date>
    </item>
    <item>
      <title>Re: Ring buffer size must be power of 2</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586287#M21408</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wmues on Fri Aug 07 02:22:30 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Sorry, this is no AND.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;It's a MODULO operation. This is the remainder of a division.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;And a division is a slow operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:25:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586287#M21408</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:25:15Z</dc:date>
    </item>
    <item>
      <title>Re: Ring buffer size must be power of 2</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586288#M21409</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by starblue on Sat Aug 08 03:15:01 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;If the modulus is a constant power of two and the operands are unsigned then the compiler should use AND.&amp;nbsp; (For signed operands a small correction is needed for negative numbers.)&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:25:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Ring-buffer-size-must-be-power-of-2/m-p/586288#M21409</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:25:16Z</dc:date>
    </item>
  </channel>
</rss>

