<?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>ColdFire/68K Microcontrollers and ProcessorsのトピックIlegal opcode when runing code in RAM (MCF52233)</title>
    <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211231#M10282</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;Hi all.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;After a few days searching on Internet, I have succesfully learned how to copy functions from ROM to RAM using the directive __declspec. It seems to do its work fine, since&amp;nbsp;it defines a seccion of RAM to place the functions and copy them there.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;The problem comes when I execute the functions. It starts fine, but after a while, executes opcodes that are invalid.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;I don't know where is the problem, if in the .lcf or in the program. I show you the interesting part of both:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;-The LCF:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text :&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mcf52235_vectors.s (.text)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.text)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.rodata)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___DATA_ROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; rom&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data_bss : AT(___DATA_ROM)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___DATA_RAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.data)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.sdata)&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 (0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.boot)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN (0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___DATA_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&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(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___BSS_START&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.sbss)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(SCOMMON)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.bss)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(COMMON)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___BSS_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&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(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___SP_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = . + (0x800);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___SP_INIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = . + (4);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___HEAP_START&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___HEAP_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ___SRAM + ___SRAM_SIZE;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; ram&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;The boot section is where I have all the functions I want to execute&amp;nbsp;from RAM. I put it between __DATA_RAM and __DATA_END, so the function common_startup copies it from ROM to RAM for me.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;-The Program Code:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;#pragma define_section bootloader ".boot" far_code__declspec(bootloader) void flash_update_i2c(){ /*Some variable declarations*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32 addr;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8 i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*Code*/&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;/PRE&gt;&lt;PRE&gt; addr=0; i=0;&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....}&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;When It executes the line addr=0 (although it is not the first command it executes in RAM) it fails due to an illegal operator:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;-Code mixed C and Assembler:&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... addr=0;20000528: 00042D40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ori.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #0x40,d42000052C: FEF8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xfef8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Invalid opcode&amp;nbsp; i=0;2000052E: 7000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; moveq&amp;nbsp;&amp;nbsp;&amp;nbsp; #0,d020000530: 2D40FEE8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.l&amp;nbsp;&amp;nbsp; d0,-280(a6)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;There are some code lines that it executes fine (the lines before addr, i=0, etc) and there are others that it don't execute fine (addr=0,&amp;nbsp;between others).&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Why can it be? Bad allignment in the .LCF? It is alligned to 16, like in ROM...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I'm completely lost...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thanks in advance,&lt;/DIV&gt;&lt;DIV&gt;Rubén Valls&lt;BR /&gt;&lt;BR /&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 18 Dec 2008 17:58:09 GMT</pubDate>
    <dc:creator>RubenV</dc:creator>
    <dc:date>2008-12-18T17:58:09Z</dc:date>
    <item>
      <title>Ilegal opcode when runing code in RAM (MCF52233)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211231#M10282</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;Hi all.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;After a few days searching on Internet, I have succesfully learned how to copy functions from ROM to RAM using the directive __declspec. It seems to do its work fine, since&amp;nbsp;it defines a seccion of RAM to place the functions and copy them there.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;The problem comes when I execute the functions. It starts fine, but after a while, executes opcodes that are invalid.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;I don't know where is the problem, if in the .lcf or in the program. I show you the interesting part of both:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 4;"&gt;-The LCF:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .text :&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mcf52235_vectors.s (.text)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.text)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.rodata)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___DATA_ROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; rom&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .data_bss : AT(___DATA_ROM)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___DATA_RAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.data)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.sdata)&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 (0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.boot)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN (0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___DATA_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&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(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___BSS_START&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.sbss)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(SCOMMON)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.bss)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(COMMON)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___BSS_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&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(0x10);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___SP_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = . + (0x800);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___SP_INIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = . + (4);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___HEAP_START&amp;nbsp;&amp;nbsp; = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___HEAP_END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ___SRAM + ___SRAM_SIZE;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;gt; ram&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;The boot section is where I have all the functions I want to execute&amp;nbsp;from RAM. I put it between __DATA_RAM and __DATA_END, so the function common_startup copies it from ROM to RAM for me.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;-The Program Code:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;#pragma define_section bootloader ".boot" far_code__declspec(bootloader) void flash_update_i2c(){ /*Some variable declarations*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32 addr;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8 i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*Code*/&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;/PRE&gt;&lt;PRE&gt; addr=0; i=0;&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....}&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;When It executes the line addr=0 (although it is not the first command it executes in RAM) it fails due to an illegal operator:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;-Code mixed C and Assembler:&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... addr=0;20000528: 00042D40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ori.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #0x40,d42000052C: FEF8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xfef8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Invalid opcode&amp;nbsp; i=0;2000052E: 7000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; moveq&amp;nbsp;&amp;nbsp;&amp;nbsp; #0,d020000530: 2D40FEE8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.l&amp;nbsp;&amp;nbsp; d0,-280(a6)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;There are some code lines that it executes fine (the lines before addr, i=0, etc) and there are others that it don't execute fine (addr=0,&amp;nbsp;between others).&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Why can it be? Bad allignment in the .LCF? It is alligned to 16, like in ROM...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I'm completely lost...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thanks in advance,&lt;/DIV&gt;&lt;DIV&gt;Rubén Valls&lt;BR /&gt;&lt;BR /&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Dec 2008 17:58:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211231#M10282</guid>
      <dc:creator>RubenV</dc:creator>
      <dc:date>2008-12-18T17:58:09Z</dc:date>
    </item>
    <item>
      <title>Re: Ilegal opcode when runing code in RAM (MCF52233)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211232#M10283</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Hello&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Did you look at FAQ 27860 on &lt;A href="http://www.freescale.com" rel="nofollow" target="_blank"&gt;www.freescale.com&lt;/A&gt;?&lt;/DIV&gt;&lt;DIV&gt;This should explain how to achieve what you are looking for.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;The .lcf file you are showing is missing some important WRITEW commands.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;CrasyCat&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Dec 2008 18:39:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211232#M10283</guid>
      <dc:creator>CrasyCat</dc:creator>
      <dc:date>2008-12-18T18:39:33Z</dc:date>
    </item>
    <item>
      <title>Re: Ilegal opcode when runing code in RAM (MCF52233)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211233#M10284</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Hi, thanks for the quick reply.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I have already seen the WRITEW commands, but what I have understood is that&amp;nbsp;this commands are usefull to copy from ROM to RAM. I have replaced the use of this commands by the use of the function common_startup, in startup.c (something like the second method in the FAQ page tells). This function already copies the code at the begining of the executation:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;    if (__DATA_ROM != __DATA_RAM)    {        dp = (uint8 *)__DATA_RAM;        sp = (uint8 *)__DATA_ROM;        n = __DATA_END - __DATA_RAM;        while (n--)            *dp++ = *sp++;    }&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;It should work, because I inserted my section ".boot" between __DATA_RAM and __DATA_END, so automatically this function will copy it without modifying anymore the .lcf.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;And about the WRITEW commands, I try with them, but I really don't know how to use the S_romp table, nor what it is exactly, and when I compile I get the error that _romp_at doesn't exists...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thanks,&lt;/DIV&gt;&lt;DIV&gt;Rubén Valls&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by RubenV on &lt;SPAN class="date_text"&gt;2008-12-18&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;11:17 AM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Dec 2008 19:15:24 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211233#M10284</guid>
      <dc:creator>RubenV</dc:creator>
      <dc:date>2008-12-18T19:15:24Z</dc:date>
    </item>
    <item>
      <title>Re: Ilegal opcode when runing code in RAM (MCF52233)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211234#M10285</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;Hello Rubén&lt;BR /&gt;&lt;BR /&gt;I'm interested by the disassmbly listing:&lt;BR /&gt;&lt;BR /&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;        ...
 addr=0;
20000528: 00042D40        ori.b    #0x40,d4
2000052C: FEF8            dc.w     0xfef8                  ; Invalid opcode

 i=0;
2000052E: 7000            moveq    #0,d0
20000530: 2D40FEE8        move.l   d0,-280(a6)
        ...&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;I think that what the compiler produced was probably:&lt;BR /&gt;&lt;BR /&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;        ...
 addr=0;
20000528: 7000            moveq    #0,d0
2000052A: 2D40FEF8        move.l   d0,-264(a6)
 i=0;
2000052E: 7000            moveq    #0,d0
20000530: 2D40FEE8        move.l   d0,-280(a6)
        ...&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;If you compare the opcodes you will see that I came up with this by changing the two bytes at address 0x20000528 from 0x0004 back to 0x7000.&lt;BR /&gt;&lt;BR /&gt;In other words, my guess is that either the first two bytes are not being copied from ROM to RAM correctly, or (more likely?) the value is being changed before the code executes.&lt;BR /&gt;&lt;BR /&gt;You could verify this hypothesis using the debugger.&lt;BR /&gt;&lt;BR /&gt;Hope this helps&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Simon&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Dec 2008 21:26:24 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211234#M10285</guid>
      <dc:creator>SimonMarsden_de</dc:creator>
      <dc:date>2008-12-18T21:26:24Z</dc:date>
    </item>
    <item>
      <title>Re: Ilegal opcode when runing code in RAM (MCF52233)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211235#M10286</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;Hi again.&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thanks Simon for pointing me to the right direction &lt;IMG alt=":smileyvery-happy:" class="emoticon emoticon-smileyvery-happy" id="smileyvery-happy" src="http://freescale.i.lithium.com/i/smilies/16x16_smiley-very-happy.gif" title="Smiley Very Happy" /&gt;. But the problem is not solved.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I have made some (insignificant) changes, and the result has been the same. Then, I have followed the copy of each byte from ROM&amp;nbsp; to RAM, and realized that some bytes are not copied (the ones wich cause the errors), but the others are.&lt;/DIV&gt;&lt;DIV&gt;I show you a part of memory where this happens (at 0x193de, the underlined part):&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;Source (ROM):000193ce:   66 a0 22 2e fe e8 20 2e fe f0 b2 80 65 00 fe 94 |f."... .....e...000193de:   &lt;U&gt;10 3c&lt;/U&gt; 00 80 13 c0 40 11 00 00 60 fe 4e 71       |.&amp;lt;....@...`.NqDestination (RAM):20000ade:   66 a0 22 2e fe e8 20 2e fe f0 b2 80 65 00 fe 94 |f."... .....e...20000aee:   00 04 00 80 13 c0 40 11 00 00 60 fe 4e 71       |......@...`.Nq           &lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;And this is the function used to copy them:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;void boot_copy(void){    extern char __START_COPY_TO_RAM[];    extern char __END_COPY_TO_RAM[];    extern char __START_COPY_ROM[];    uint32 n;    uint8 *dp, *sp;     dp = (uint8 *)__START_COPY_TO_RAM;    sp = (uint8 *)__START_COPY_ROM;    n = __END_COPY_TO_RAM - __START_COPY_TO_RAM;    while (n--)    {      *dp = *sp;      dp++;      sp++;    }}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;About the question of being modified after copy them, I have all interrupts disabled. After calling that function, I execute the next orders:&lt;/P&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;asm {move.w #0x7700,sr}MCF_INTC0_IMRL |= MCF_INTC_IMRL_MASKALL;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;What is happening has no sense... I don't know why almost all the bytes are copied OK, but there are some bytes that aren't... and not always are the same, now they are at 0x200 0AEE, and in the previous post, they where at 0x2000 0528...&lt;/P&gt;&lt;P&gt;Thanks in advance,&lt;/P&gt;&lt;DIV&gt;Rubén&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Edit: I have tried to write directly my own values and the result is that they have not been copied. I used the easiest way to do this:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;uint8 *x;x=(uint8 *)0x20000AEE;*x=10;*x=20;*x=30;&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;The result is that the value 0x00 is never replaced. Can the RAM memory be damaged anyway? Just in a few bytes? Or I'm addressing some reserved bytes?&lt;/DIV&gt;&lt;DIV&gt;This does NOT happen with the address of the first message... What is happening?&lt;/DIV&gt;&lt;DIV&gt;I'm completely missed...&lt;/DIV&gt;&lt;DIV&gt;I'm going to try with another board (and other project) to check it...&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by RubenV on &lt;SPAN class="date_text"&gt;2008-12-19&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;09:43 AM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Dec 2008 17:24:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211235#M10286</guid>
      <dc:creator>RubenV</dc:creator>
      <dc:date>2008-12-19T17:24:28Z</dc:date>
    </item>
    <item>
      <title>Re: Ilegal opcode when runing code in RAM (MCF52233)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211236#M10287</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;Hi Rubén&lt;BR /&gt;&lt;BR /&gt;I notice that the altered value is the same: 0x0004. Any clue in that?&lt;BR /&gt;&lt;BR /&gt;Two other suggestions:&lt;BR /&gt;&lt;BR /&gt;(1) I suggest you disable interrupts &lt;I&gt;before&lt;/I&gt; copying the data from ROM to RAM, just to completely exclude the possibility of the change being caused by an interrupt&lt;BR /&gt;&lt;BR /&gt;(2) Have you seen the MCF5223X Device Errata? The link is:&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://www.freescale.com/files/32bit/doc/errata/MCF52235DE.pdf" rel="nofollow" target="_blank"&gt;http://www.freescale.com/files/32bit/doc/errata/MCF52235DE.pdf&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;It describes a problem with speculative reads from Flash at the same time as writing to SRAM, together with a solution involving the FLASHBAR register. Have you seen / tried that?&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Cheers&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Simon&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Dec 2008 17:53:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211236#M10287</guid>
      <dc:creator>SimonMarsden_de</dc:creator>
      <dc:date>2008-12-19T17:53:46Z</dc:date>
    </item>
    <item>
      <title>Re: Ilegal opcode when runing code in RAM (MCF52233)</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211237#M10288</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Hi again.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Jeje, I&amp;nbsp;write "after" when I want to say "before" &lt;IMG alt=":smileyvery-happy:" class="emoticon emoticon-smileyvery-happy" id="smileyvery-happy" src="http://freescale.i.lithium.com/i/smilies/16x16_smiley-very-happy.gif" title="Smiley Very Happy" /&gt;, so sugestion (1) was already checked.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;About sugestion (2), I read about it, but in the init of the program the bit 6 of the FLASHBAR was already set. Anyway, I inserted a few nops between easier operations (use x=*sp, *dp=x instead of *dp=*sp) and the result is the same.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I'm going to surrender and try another way to do the bootloader: executing it from a single page of ROM and don't updating it. If anytime I could do the copy correctly, then I will include&amp;nbsp;the good&amp;nbsp;bootloader in the new image, they will coexist&amp;nbsp;during one release (although the old will not be used) and the old will be deleted in the next update, so it is not a great lose.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thanks for the help,&lt;/DIV&gt;&lt;DIV&gt;Rubén&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Dec 2008 20:07:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Ilegal-opcode-when-runing-code-in-RAM-MCF52233/m-p/211237#M10288</guid>
      <dc:creator>RubenV</dc:creator>
      <dc:date>2008-12-19T20:07:52Z</dc:date>
    </item>
  </channel>
</rss>

