<?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 Hardfault in interrupt driver in LPCXpresso IDE</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE/Hardfault-in-interrupt-driver/m-p/550541#M11463</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by fentechnt on Mon Feb 15 06:03:02 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I've been porting my serial port driver across from LPC21xx and it randomly causes a hard fault.&amp;nbsp; I've been debugging it by removing lines in the interrupt handler and the fault disappears if I remove the line that writes the incoming serial data to a buffer.&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;
#define SERIAL_BUFFER_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 64 )
#define SERIAL_BUFFER_LENGTH_MASK&amp;nbsp;&amp;nbsp;&amp;nbsp; ( SERIAL_BUFFER_SIZE - 1 )

typedef struct tSerialBufferTag
{
&amp;nbsp; int iPutPtr;
&amp;nbsp; int iGetPtr;
&amp;nbsp; byte abBuffer[ SERIAL_BUFFER_SIZE ];
} tSerialBuffer;

static volatile tSerialBuffer sInputBuffer;
static volatile tSerialBuffer sOutputBuffer;
static volatile bool boTHRE = TRUE;

void UART_IRQHandler( void )
{
&amp;nbsp; static char cChar;
&amp;nbsp; static byte bIIR;

&amp;nbsp; // What caused the interrupt?
&amp;nbsp; bIIR = LPC_UART-&amp;gt;IIR;
&amp;nbsp; switch( bIIR &amp;amp; UART_INTERRUPT_SOURCE_MASK )
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; case UART_SOURCE_RLS:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Not handling this, but clear the interrupt.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = LPC_UART-&amp;gt;LSR;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;

&amp;nbsp;&amp;nbsp;&amp;nbsp; case UART_SOURCE_THRE:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The THR is empty.&amp;nbsp; If there is another character in the Tx
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // buffer, send it now.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( sOutputBuffer.iGetPtr != sOutputBuffer.iPutPtr )
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
#if 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = sOutputBuffer.abBuffer[ sOutputBuffer.iGetPtr &amp;amp; SERIAL_BUFFER_LENGTH_MASK ];
#endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sOutputBuffer.iGetPtr++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART-&amp;gt;THR = cChar;
&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; // nothing to send, indicate transmitter-empty to driver
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boTHRE = TRUE;
&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; case UART_SOURCE_RX_TIMEOUT:
&amp;nbsp;&amp;nbsp;&amp;nbsp; case UART_SOURCE_RX:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // A character was received.&amp;nbsp; Place it in the queue of received characters.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = LPC_UART-&amp;gt;RBR;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( sInputBuffer.iPutPtr + 1 != sInputBuffer.iGetPtr )
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
#if 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sInputBuffer.abBuffer[ sInputBuffer.iPutPtr &amp;amp; SERIAL_BUFFER_LENGTH_MASK ] = cChar;
#endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sInputBuffer.iPutPtr++;
&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; case UART_SOURCE_MSR:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // @TODO: deal with this properly - for now just clear it
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = LPC_UART-&amp;gt;MSR;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;

&amp;nbsp;&amp;nbsp;&amp;nbsp; default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // There is nothing to do, leave the ISR.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In the code above, I've commented out the lines that make the hardfault happen.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The fault sometimes happens on the first few characters sent or recieved, other times it happens after several hundred characters.&amp;nbsp; So it doesn't seem related to the buffer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Only other interrupt running is the SysTick interrupt which is handled elsewhere (and only increments a counter for debug).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any suggestions, anyone?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 16 Jun 2016 00:38:51 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-16T00:38:51Z</dc:date>
    <item>
      <title>Hardfault in interrupt driver</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/Hardfault-in-interrupt-driver/m-p/550541#M11463</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by fentechnt on Mon Feb 15 06:03:02 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I've been porting my serial port driver across from LPC21xx and it randomly causes a hard fault.&amp;nbsp; I've been debugging it by removing lines in the interrupt handler and the fault disappears if I remove the line that writes the incoming serial data to a buffer.&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;
#define SERIAL_BUFFER_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 64 )
#define SERIAL_BUFFER_LENGTH_MASK&amp;nbsp;&amp;nbsp;&amp;nbsp; ( SERIAL_BUFFER_SIZE - 1 )

typedef struct tSerialBufferTag
{
&amp;nbsp; int iPutPtr;
&amp;nbsp; int iGetPtr;
&amp;nbsp; byte abBuffer[ SERIAL_BUFFER_SIZE ];
} tSerialBuffer;

static volatile tSerialBuffer sInputBuffer;
static volatile tSerialBuffer sOutputBuffer;
static volatile bool boTHRE = TRUE;

void UART_IRQHandler( void )
{
&amp;nbsp; static char cChar;
&amp;nbsp; static byte bIIR;

&amp;nbsp; // What caused the interrupt?
&amp;nbsp; bIIR = LPC_UART-&amp;gt;IIR;
&amp;nbsp; switch( bIIR &amp;amp; UART_INTERRUPT_SOURCE_MASK )
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; case UART_SOURCE_RLS:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Not handling this, but clear the interrupt.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = LPC_UART-&amp;gt;LSR;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;

&amp;nbsp;&amp;nbsp;&amp;nbsp; case UART_SOURCE_THRE:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The THR is empty.&amp;nbsp; If there is another character in the Tx
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // buffer, send it now.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( sOutputBuffer.iGetPtr != sOutputBuffer.iPutPtr )
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
#if 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = sOutputBuffer.abBuffer[ sOutputBuffer.iGetPtr &amp;amp; SERIAL_BUFFER_LENGTH_MASK ];
#endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sOutputBuffer.iGetPtr++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART-&amp;gt;THR = cChar;
&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; // nothing to send, indicate transmitter-empty to driver
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boTHRE = TRUE;
&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; case UART_SOURCE_RX_TIMEOUT:
&amp;nbsp;&amp;nbsp;&amp;nbsp; case UART_SOURCE_RX:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // A character was received.&amp;nbsp; Place it in the queue of received characters.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = LPC_UART-&amp;gt;RBR;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( sInputBuffer.iPutPtr + 1 != sInputBuffer.iGetPtr )
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
#if 0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sInputBuffer.abBuffer[ sInputBuffer.iPutPtr &amp;amp; SERIAL_BUFFER_LENGTH_MASK ] = cChar;
#endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sInputBuffer.iPutPtr++;
&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; case UART_SOURCE_MSR:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // @TODO: deal with this properly - for now just clear it
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cChar = LPC_UART-&amp;gt;MSR;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;

&amp;nbsp;&amp;nbsp;&amp;nbsp; default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // There is nothing to do, leave the ISR.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In the code above, I've commented out the lines that make the hardfault happen.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The fault sometimes happens on the first few characters sent or recieved, other times it happens after several hundred characters.&amp;nbsp; So it doesn't seem related to the buffer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Only other interrupt running is the SysTick interrupt which is handled elsewhere (and only increments a counter for debug).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any suggestions, anyone?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 00:38:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/Hardfault-in-interrupt-driver/m-p/550541#M11463</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T00:38:51Z</dc:date>
    </item>
    <item>
      <title>Re: Hardfault in interrupt driver</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/Hardfault-in-interrupt-driver/m-p/550542#M11464</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by rkiryanov on Mon Feb 15 06:09:33 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;stack overflow?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 00:38:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/Hardfault-in-interrupt-driver/m-p/550542#M11464</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T00:38:51Z</dc:date>
    </item>
    <item>
      <title>Re: Hardfault in interrupt driver</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/Hardfault-in-interrupt-driver/m-p/550543#M11465</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by fentechnt on Mon Feb 15 06:30:37 MST 2010&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I did wonder about this, but I don't that is it.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The map file shows that the stack top (_vStackTop) is at 0x10001ff0 and the last variables are at 0x10000710.&amp;nbsp; There is no dynamic allocation used, so the heap should be unused (starts at 0x10000710).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So there should be plenty of stack available, although I must confess I have no idea whether the interrupt stack is allocated separately or what...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When stepping through the code, the stack pointer is typically somewhere around 0x10001f50 - again indicating that there is plenty stack available.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 00:38:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/Hardfault-in-interrupt-driver/m-p/550543#M11465</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T00:38:52Z</dc:date>
    </item>
  </channel>
</rss>

