placing variable in ROM on exact location(using FRDM KE06)

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

placing variable in ROM on exact location(using FRDM KE06)

Jump to solution
1,085 Views
mark313
Contributor I

Hi,

Does anyone know how to place a variable on a exact location in ROM?

I tried the following methods:

volatile int bootStatus __attribute__((at(0xC0))) = 0x66;

int variable2 __attribute__((section(".id_firmware.__at_0xe2"))) = 10;

const int x1 __attribute__((at(0x200))) = 10; /* RO */

__attribute__ ((section(".id_firmware"))) uint32_t aap = 0x11223344;

this one doesn't write the memory on itself but when referring to it in the main on this way:

aap = aap;

it will place the data in opposite order (44332211) and the program gets a hard_fault interrupt.

memory layout in linker file is as follows:

MEMORY {

  m_interrupts               (RX)     : ORIGIN = 0x00000000, LENGTH = 0x000000C0

  my_id_firmware          (RX)     : ORIGIN = 0x000000c0, LENGTH = 0x00000340

  m_text                  (RX)     : ORIGIN = 0x00000410, LENGTH = 0x00002BF0

  m_data                  (RW)     : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000

  m_cfmprotrom            (RX)     : ORIGIN = 0x00000400, LENGTH = 0x00000010

}

/* Define output sections */

SECTIONS

{

  /* The startup code goes first into INTERNAL_FLASH */

  .interrupts :

  {

    __vector_table = .;

    . = ALIGN(4);

    KEEP(*(.vectortable)) /* Startup code */

    . = ALIGN(4);

  } > m_interrupts

    /* Section created to relocate code in specific Flash address */

    .id_firmware :

    {

        . = ALIGN(4);

        *(.myROM)

        . = ALIGN(4);

    } > my_id_firmware

The only thing I want is to hardcode a few variables in ROM so that I can access them from a bootloader program as well as the actual firmware program.

I am using MKE06Z128LK4 Microcontroller

I would be really great if someone can help me!

0 Kudos
1 Solution
826 Views
Jorge_Gonzalez
NXP Employee
NXP Employee

Hello Mark:

Sorry, actually the hardfault was easy to figure out from your first post. The code aap = aap is both a read and a write access, but you are placing this variable in flash memory space, which cannot be written with a simple C code instruction. So you need to remove that line of code.

However you are right that if the aap variable is not referenced from your code then the linker discards it. To avoid this you can use the command KEEP, like this:

/* Section created to relocate code in specific Flash address */

.id_firmware :

{

    . = ALIGN(4);

    KEEP(*(.id_firmware))

    . = ALIGN(4);

} > my_id_firmware

Then any symbols (functions or variables) you place in the input section .id_firmware will not be optimized out.

I hope this helps you move forward.

Regards!

Jorge Gonzalez

View solution in original post

0 Kudos
6 Replies
826 Views
Jorge_Gonzalez
NXP Employee
NXP Employee

Hello Mark de Groot:

This guide should be what you are looking for: Defining Variables at Absolute Addresses with gcc | MCU on Eclipse

There is also an extensive document about this topic here: Relocating Code and Data Using the KDS GCC Linker File for Kinetis

The correct syntax is the one you have for aap, but in the linker file the input section should be called .id_firmware instead of .myROM, like next:

  .id_firmware :

  {

      . = ALIGN(4);

      *(.id_firmware)

      . = ALIGN(4);

  } > my_id_firmware

Let me know if you still have issues.


Best Regards!
Jorge Gonzalez

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos
826 Views
mark313
Contributor I

Thank you for your answer!

Unfortunately, I still get a hard_fault interrupt when changing .myROM to .id_firmware.

also, thanks for the document, the whole thing makes a bit more sense to me now.

0 Kudos
826 Views
Jorge_Gonzalez
NXP Employee
NXP Employee

Hi Mark:

In your case the placement of the variables should not cause any hardfault. If you are still having this issue please share your project with me and I can give it a check.

Regards!

Jorge Gonzalez

0 Kudos
826 Views
mark313
Contributor I

Hi Jorge,

That would be great!

My project is included.

Thank you so far!

0 Kudos
827 Views
Jorge_Gonzalez
NXP Employee
NXP Employee

Hello Mark:

Sorry, actually the hardfault was easy to figure out from your first post. The code aap = aap is both a read and a write access, but you are placing this variable in flash memory space, which cannot be written with a simple C code instruction. So you need to remove that line of code.

However you are right that if the aap variable is not referenced from your code then the linker discards it. To avoid this you can use the command KEEP, like this:

/* Section created to relocate code in specific Flash address */

.id_firmware :

{

    . = ALIGN(4);

    KEEP(*(.id_firmware))

    . = ALIGN(4);

} > my_id_firmware

Then any symbols (functions or variables) you place in the input section .id_firmware will not be optimized out.

I hope this helps you move forward.

Regards!

Jorge Gonzalez

0 Kudos
826 Views
mark313
Contributor I

This is working!

Thank you very much for your help!

0 Kudos