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

[Cortex-M3] Execution code from RAM during Flash Programming

I am writing a bootloader for Cortex M3 Toshiba controller.

During Flash Programming I need to execute code from RAM as entire Flash is inaccessible during write/erase operations

I wish to know how to copy code from FLASH to RAM and execute that code from RAM.

Thanks...
Parents
  • Note: This was originally posted on 10th April 2012 at http://forums.arm.com

    Hi Joseph,

    I am doing this kind of job also for keil c compiler.
    Do I also need the .SCT file to specify the code address?
    Could you advice?

    BR
    Kent


    In that case, it would be easier to copy the whole boot loader (rather than a portion of it) from flash to SRAM in the assembly startup code.
    The boot loader, assumed to be mostly written in C, will have to linked to use the SRAM address as program memory range.

    In the assembly startup code you will have a reset handler, and normally you can see something like:

    Reset_Handler   PROC
                    EXPORT  Reset_Handler             [WEAK]
                    IMPORT  __main
                    LDR     R0,=__main
                    BX        R0   ; this branch to C startup code
                    ENDP

    You can insert an assembly code to copy the memory from flash to SRAM, before jumping to the C startup code which will be in SRAM.

    Reset_Handler   PROC
                    EXPORT  Reset_Handler             [WEAK]
                    LDR     R4,=0x00000000 ; Source starting address
                    LDR     R5,=0x20000000 ; Destination starting address
                    LDR     R6,=0x4000     ; 16K program size to copy
    CopyFlashToSRAMLoop
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}               
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}               
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}               
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}
                    SUBS    R6,#64 ; Each time 64 bytes are copied
                    BNE    CopyFlashToSRAMLoop
                    IMPORT  __main
                    LDR     R0,=__main
                    BX        R0   ; this branch to C startup code        
                    ENDP

    In this way, the whole boot loader will be running in SRAM.  You need to be careful to make sure that the data use by the boot loader is not in the same address as the instruction memory.

    regards,
    Joseph
Reply
  • Note: This was originally posted on 10th April 2012 at http://forums.arm.com

    Hi Joseph,

    I am doing this kind of job also for keil c compiler.
    Do I also need the .SCT file to specify the code address?
    Could you advice?

    BR
    Kent


    In that case, it would be easier to copy the whole boot loader (rather than a portion of it) from flash to SRAM in the assembly startup code.
    The boot loader, assumed to be mostly written in C, will have to linked to use the SRAM address as program memory range.

    In the assembly startup code you will have a reset handler, and normally you can see something like:

    Reset_Handler   PROC
                    EXPORT  Reset_Handler             [WEAK]
                    IMPORT  __main
                    LDR     R0,=__main
                    BX        R0   ; this branch to C startup code
                    ENDP

    You can insert an assembly code to copy the memory from flash to SRAM, before jumping to the C startup code which will be in SRAM.

    Reset_Handler   PROC
                    EXPORT  Reset_Handler             [WEAK]
                    LDR     R4,=0x00000000 ; Source starting address
                    LDR     R5,=0x20000000 ; Destination starting address
                    LDR     R6,=0x4000     ; 16K program size to copy
    CopyFlashToSRAMLoop
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}               
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}               
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}               
                    LDMIA    R4!,{R0-R3}
                    STMIA    R5!,{R0-R3}
                    SUBS    R6,#64 ; Each time 64 bytes are copied
                    BNE    CopyFlashToSRAMLoop
                    IMPORT  __main
                    LDR     R0,=__main
                    BX        R0   ; this branch to C startup code        
                    ENDP

    In this way, the whole boot loader will be running in SRAM.  You need to be careful to make sure that the data use by the boot loader is not in the same address as the instruction memory.

    regards,
    Joseph
Children
No data