EmbDev.net

Forum: ARM programming with GCC/GNU tools sector change on lpc2148


Author: Guest (Guest)
Posted on:

Rate this post
0 useful
not useful
Hi,
My problem is:
I have to write with IAP to flash, so I need to save the .text section
after 0x00001000 or 0x00002000 on flash memory.
my linker script for flash executeing is:

ENTRY(_startup)      /* our entry point in startup-code */

/* LPC2148 memory map */

MEMORY
{
  flash       : ORIGIN = 0x00000000, LENGTH = 500K
/* available flash memory LPC2148 */
  ram       : ORIGIN = 0x40000200, LENGTH = 31964
/* free useable RAM of LPC2148 */
}

/* now define the output sections  */

SECTIONS
{
  . = 0;

  startup :
  {
    *(.startup)
  } >flash

  /* all code and readonly values */

  .text :
  {
    *(.text)
/* all .text sections (code)  */
    *(.rodata)
/* all .rodata sections (constants, strings, etc.)  */
    *(.rodata*)
/* all .rodata* sections (constants, strings, etc.)  */
    *(.glue_7)
/* all .glue_7 sections  (no idea what these are) */
    *(.glue_7t)
/* all .glue_7t sections (no idea what these are) */
  } >flash
  _text_end = . ;

  /* initialized data */

  .data :
  {
    _data_start = . ;
    *(.data)
  } >ram AT >flash
/* put all the above into RAM (but load the LMA copy into FLASH) */
  . = ALIGN(4);
  _data_end = . ;

  /* uninitialized data */

  .bss :
/* bss = block started by symbol */
  {
    _bss_start = . ;
    *(.bss)
  } >ram
/* put all the above in RAM (it will be cleared in the startup code */
  . = ALIGN(4);
  _bss_end = . ;
/* define a global symbol marking the end of the .bss section */


  /* stack area */

  /*
    NOTE:
    It will be filled to lower addresses and must begin on align(4)
boundary.
   */
  _stack_end = . ;
  _stack_start = 0x40007EDC;
/* top of free useable memory */


  _end = .;
/* define a global symbol marking the end of application RAM */
}

If I set
flash       : ORIGIN = 0x00001000, LENGTH = 500K
the mapfile shows me that .text section beginns at 0x00001000
but the programm doesn`t work after this change.
Have anybody an idea?

thx
Marco

Author: Jim Kaz (ancaritha)
Posted on:

Rate this post
0 useful
not useful
> If I set
> flash       : ORIGIN = 0x00001000, LENGTH = 500K
> the mapfile shows me that .text section beginns at 0x00001000
> but the programm doesn`t work after this change.
> Have anybody an idea?


I could be quite wrong on this, but it could be that by forcing a change
in the ORIGIN the vector table isn't updated with the new location, so
its jumping to the old code location.  Again, I could be wrong on this.

I think the better way to do this is to use a linker flag to move the
start location of the text section.  On GCC-AVR it would be something
like:
-Wl,--section-start=.text=0x100

What this command is for you depends on what compiler your using
probably.

Author: Martin Thomas (mthomas) (Moderator)
Posted on:

Rate this post
0 useful
not useful
First check if at least the exceptions-vectors are assigned to a section
named .startup. Something like this in the asm-file for the
exceptions-vectors:

...
section .startup, "ax"
  LDR PC, ResetAddress
...

If not this might cause the problem as Jim Kaz already mentioned. If
this is already done (verify this in the map-file) you could try this
approach in the linker-script:

...
MEMORY
{
   flash_start_vect : ORIGIN = 0x00000000, LENGTH = 0x1000
   flash            : ORIGIN = 0x00002000, LENGTH = 500K-0x2000
...
SECTIONS
{
   . = ORIGIN(flash_start_vect);
    startup :
   {
     *(.startup .startup.*)
   } >flash_start_vect
   . = ORIGIN(flash);
   .text :
   {
...
   } >flash
...

(The ORIGIN() lines might be redundant). A --start-section option for
.startup passed to the linker with the frontend's -WL option as proposed
by Jim Kaz should work too but since you are using a self-made
linker-script anyway you could modify it to your needs.

> If I set
> flash       : ORIGIN = 0x00001000, LENGTH = 500K
> the mapfile shows me that .text section beginns at 0x00001000
> but the programm doesn`t work after this change.
> Have anybody an idea?

Did you check the location of "startup". If you look into the
disassembly which instruction is at address 0x00000000? It must be the a
"jump" since the reset-vector is expected there.

Why do you use a memory-section between the application-code and not a
section at the "high end"/top of the flash-memory? IRC the LPC2148
offers some "small" flash sectors there too. Then you can simple reduce
the length for the FLASH memory in the linker-script to make sure that
the application code does not overlap with this section and keep
everything else as it is.

Martin Thomas

Author: Guest (Guest)
Posted on:

Rate this post
0 useful
not useful
Thx,
i had to process one other projekt until now.

Martin Thomas wrote:
>
> Did you check the location of "startup". If you look into the
> disassembly which instruction is at address 0x00000000? It must be the a
> "jump" since the reset-vector is expected there.
>

I looked at the startup.s and at this file there is the start of the
flash section defined like:

.ifdef FLASH
        .=.
.endif

if i write ".=.+0x2000" the flash section will be start at 2000h and now
i can write to the adress 0x1000 whitout problems. I had to use this
section because the lpc2148 sections at the end of the flash are 32kB.

thx & bye
Marco

Reply

Entering an e-mail address is optional. If you want to receive reply notifications by e-mail, please log in.

Rules — please read before posting

  • Post long source code as attachment, not in the text
  • Posting advertisements is forbidden.

Formatting options

  • [c]C code[/c]
  • [avrasm]AVR assembler code[/avrasm]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]




Bild automatisch verkleinern, falls nötig
Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.