<?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 Running assembler functions from SRAM ends up on HardFault_Handler() in LPCXpresso IDE</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE/Running-assembler-functions-from-SRAM-ends-up-on-HardFault/m-p/579085#M23958</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by jookie on Wed Jun 13 08:40:33 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm trying to make my assembler functions run from SRAM of my LPC1343. As shown in other examples I tried to use the ram_func() like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;declaration:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void ram_func();&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;
definition:
__attribute__ ((__section__(".data.ramfunc")))
void ram_func() {
&amp;nbsp; __asm volatile ("nop\n\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;usage:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ram_func();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;...and everything goes well. Now I try to do something similar with my assembler function written in separate .s file.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;declaration:&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;
extern void DataAsInput();
&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 .s file:&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;
.section .data.ramfunc

 .syntax unified
 .cpu cortex-m3
 .thumb
 .align4
 .globalDataAsInput
 .thumb_func

DataAsInput:
push{r3, r4, lr}

ldrr3, = PIO2_DIR
movr4, # ACSI_DATA_IN
str.wr4, [r3]

 pop{r3, r4, lr}

 bxlr
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;...and I call it like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;DataAsInput();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;- this crashes on the first instruction (push {...}) -- ends up on void [B]HardFault_Handler(void)[/B]. When I let it run from the flash (that means I don't put there the '.section .data.ramfunc' line), everything runs well. From the .map file I see that both functions (ram_func() and DataAsInput()) are located in SRAM:&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;
 .data.ramfunc&amp;nbsp; 0x10000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x320 ./src/bridge.o
...
&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; 0x10000060&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; DataAsInput
...
 .data.ramfunc&amp;nbsp; 0x10000320&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x18 ./src/main.o
&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; 0x10000320&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; ram_func
&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; 0x10000338&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; . = ALIGN (0x4)
&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; 0x10000338&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; _edata = .
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;...but there seems to be something wrong anyway. I'm trying to locate my assembler functions in SRAM due to performance, and having it all in __asm volatile ("..."); is bit annoying. So, where's the catch?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Miro&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 16 Jun 2016 02:33:10 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-16T02:33:10Z</dc:date>
    <item>
      <title>Running assembler functions from SRAM ends up on HardFault_Handler()</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/Running-assembler-functions-from-SRAM-ends-up-on-HardFault/m-p/579085#M23958</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by jookie on Wed Jun 13 08:40:33 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm trying to make my assembler functions run from SRAM of my LPC1343. As shown in other examples I tried to use the ram_func() like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;declaration:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void ram_func();&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;
definition:
__attribute__ ((__section__(".data.ramfunc")))
void ram_func() {
&amp;nbsp; __asm volatile ("nop\n\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;usage:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ram_func();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;...and everything goes well. Now I try to do something similar with my assembler function written in separate .s file.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;declaration:&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;
extern void DataAsInput();
&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 .s file:&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;
.section .data.ramfunc

 .syntax unified
 .cpu cortex-m3
 .thumb
 .align4
 .globalDataAsInput
 .thumb_func

DataAsInput:
push{r3, r4, lr}

ldrr3, = PIO2_DIR
movr4, # ACSI_DATA_IN
str.wr4, [r3]

 pop{r3, r4, lr}

 bxlr
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;...and I call it like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;DataAsInput();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;- this crashes on the first instruction (push {...}) -- ends up on void [B]HardFault_Handler(void)[/B]. When I let it run from the flash (that means I don't put there the '.section .data.ramfunc' line), everything runs well. From the .map file I see that both functions (ram_func() and DataAsInput()) are located in SRAM:&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;
 .data.ramfunc&amp;nbsp; 0x10000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x320 ./src/bridge.o
...
&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; 0x10000060&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; DataAsInput
...
 .data.ramfunc&amp;nbsp; 0x10000320&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x18 ./src/main.o
&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; 0x10000320&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; ram_func
&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; 0x10000338&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; . = ALIGN (0x4)
&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; 0x10000338&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; _edata = .
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;...but there seems to be something wrong anyway. I'm trying to locate my assembler functions in SRAM due to performance, and having it all in __asm volatile ("..."); is bit annoying. So, where's the catch?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Miro&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 02:33:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/Running-assembler-functions-from-SRAM-ends-up-on-HardFault/m-p/579085#M23958</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T02:33:10Z</dc:date>
    </item>
    <item>
      <title>Re: Running assembler functions from SRAM ends up on HardFault_Handler()</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/Running-assembler-functions-from-SRAM-ends-up-on-HardFault/m-p/579086#M23959</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by CodeRedSupport on Wed Jun 13 12:43:21 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Try changing your section statement to:&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;.section .data.ramfunc,"ax",%progbits&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Without this, your function is being treated as a data label, which causes it to not get the bottom bit of its address to be set. This causes the linker to try to treat the function call as a Thumb to ARM interworking call and use a BLX instruction. Changing to ARM state like this causes a hard fault on Cortex-M parts (as ARM state doesn't actually exist).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CodeRedSupport.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 02:33:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/Running-assembler-functions-from-SRAM-ends-up-on-HardFault/m-p/579086#M23959</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T02:33:11Z</dc:date>
    </item>
    <item>
      <title>Re: Running assembler functions from SRAM ends up on HardFault_Handler()</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/Running-assembler-functions-from-SRAM-ends-up-on-HardFault/m-p/579087#M23960</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by jookie on Thu Jun 14 00:26:36 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;CodeRedSupport, thank you, that totally helped! For the future cases, is there a way to tell if this sort of thing is happening in debugger (the ARM vs. Thumb-2 stuff)?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Btw. - my performace issue was due forgetting to set the system clock to 72 MHz :)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Miro&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jun 2016 02:33:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/Running-assembler-functions-from-SRAM-ends-up-on-HardFault/m-p/579087#M23960</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-16T02:33:12Z</dc:date>
    </item>
  </channel>
</rss>

