This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Function located to a fixed address

ARM MDK 3.4: module / function startadress.
I would like to have a flash programming function on a specified address (0xf000) from where the normal program can be updated. This would be a simplified approach for ISP. If something goes wrong, JTAG will solve this problem.
I could not find a linker control which would allow this. I already searched forum, with no success.

Functionality:
a) first installed program (0x0000..<0xf000) contains ISP function on 0xf000
b) updated program (0x0000..<0xf000) does not contain ISP function, only absolut call to it.

Thanks for any hints Werner

Parents
  • > Thank you, I still feel "in the dark". Is there a step by step
    > explanation of the therms used for this scatter script language ie:

    LR_IROM1 0x00000000 0x00020000  {    ; load region size_region
    

    A load region describes the memory map before reloction, usually in a
    non-volatile memory.

    The execution regions define both, the contents of the load region, as
    well as the memory map after relocation.

      ER_IROM1 0x00000000 0x00020000  {  ; load address = execution address
    

    ER_IROM1 describes what can stay in flash for proper operation.

       *.o (RESET, +First)
    

    That would be the startup code including vectors. +FIRST means that
    this has got to be first in the region. The order in the scatter
    loading file has no impact on the actual order of elements.

       *(InRoot$$Sections)
    

    Some portions of the C-library have to be in flash as well. As a short
    hand, these are refered to by the name "InRoot$$Sections".

       .ANY (+RO)
    

    Any other read-only portions of the image (code, literal pools) go here.

      }
      RW_IRAM1 0x20000000 0x00008000  {  ; RW data
       .ANY (+RW +ZI)
      }
    

    All variable go into RAM.

    }
    

    To get what you want, you'd have to divide your flash into two
    regions:

    LR_IROM1 0x00000000 0x00020000  {    ; load region size_region
      ER_IROM1 0x00000000 0x0000f000  {  ; load address = execution address
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
      }
      ER_IROM2 +0 (0x00020000-0x0000f000) {
        *.o (ISP_SECTION, +RO)
      }
      RW_IRAM1 0x20000000 0x00008000  {  ; RW data
       .ANY (+RW +ZI)
      }
    }
    

    Now all flash space between 0x0000f000 and 0x00020000 can be used for
    ISP. You will have to adapt this to your requirements.

    > LR_IROM1 is this a reserved word? I can guess IROM1 means internal
    > ROM, LR is not clear to me.

    The region names are just identifiers. Only some names have a special
    meaning (not reserved, though).

    > Using the help system and it's examples just leads me to places,
    > where experts that already know most of it understand it's full
    > meaning, the introductional is too abstact/generic for me.

    infocenter.arm.com/.../Degxrsh.html

    And don't forget to tell MDK not to clobber your scatter file!
    Or give it a different name.

    Regards
    Marcus
    http://www.doulos.com/arm/

Reply
  • > Thank you, I still feel "in the dark". Is there a step by step
    > explanation of the therms used for this scatter script language ie:

    LR_IROM1 0x00000000 0x00020000  {    ; load region size_region
    

    A load region describes the memory map before reloction, usually in a
    non-volatile memory.

    The execution regions define both, the contents of the load region, as
    well as the memory map after relocation.

      ER_IROM1 0x00000000 0x00020000  {  ; load address = execution address
    

    ER_IROM1 describes what can stay in flash for proper operation.

       *.o (RESET, +First)
    

    That would be the startup code including vectors. +FIRST means that
    this has got to be first in the region. The order in the scatter
    loading file has no impact on the actual order of elements.

       *(InRoot$$Sections)
    

    Some portions of the C-library have to be in flash as well. As a short
    hand, these are refered to by the name "InRoot$$Sections".

       .ANY (+RO)
    

    Any other read-only portions of the image (code, literal pools) go here.

      }
      RW_IRAM1 0x20000000 0x00008000  {  ; RW data
       .ANY (+RW +ZI)
      }
    

    All variable go into RAM.

    }
    

    To get what you want, you'd have to divide your flash into two
    regions:

    LR_IROM1 0x00000000 0x00020000  {    ; load region size_region
      ER_IROM1 0x00000000 0x0000f000  {  ; load address = execution address
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
      }
      ER_IROM2 +0 (0x00020000-0x0000f000) {
        *.o (ISP_SECTION, +RO)
      }
      RW_IRAM1 0x20000000 0x00008000  {  ; RW data
       .ANY (+RW +ZI)
      }
    }
    

    Now all flash space between 0x0000f000 and 0x00020000 can be used for
    ISP. You will have to adapt this to your requirements.

    > LR_IROM1 is this a reserved word? I can guess IROM1 means internal
    > ROM, LR is not clear to me.

    The region names are just identifiers. Only some names have a special
    meaning (not reserved, though).

    > Using the help system and it's examples just leads me to places,
    > where experts that already know most of it understand it's full
    > meaning, the introductional is too abstact/generic for me.

    infocenter.arm.com/.../Degxrsh.html

    And don't forget to tell MDK not to clobber your scatter file!
    Or give it a different name.

    Regards
    Marcus
    http://www.doulos.com/arm/

Children