ROM and RAM remapping
You must consider what sort of memory your system has at address
0x0, the address of the first instruction executed.
This information does not apply to Armv6‑M, Armv7‑M, and Armv8‑M profiles.
This information assumes that an Arm® processor begins fetching instructions at
0x0. This is the standard behavior for
systems based on Arm processors. However, some Arm processors, for example the processors
based on the Armv7‑A architecture, can be configured to begin fetching instructions from
There has to be a valid instruction at
startup, so you must have nonvolatile memory located at
the moment of power-on reset. One way to achieve this is to have
ROM located at
0x0. However, there are some drawbacks
to this configuration.
Example ROM/RAM remapping
This example shows a solution implementing ROM/RAM remapping after reset. The constants shown are specific to the Versatile board, but the same method is applicable to any platform that implements remapping in a similar way. Scatter files must describe the memory map after remapping.
; System memory locations Versatile_ctl_reg EQU 0x101E0000 ; Address of control register DEVCHIP_Remap_bit EQU 0x100 ; Bit 8 is remap bit of control register ENTRY ; Code execution starts here on reset ; On reset, an alias of ROM is at 0x0, so jump to 'real' ROM. LDR pc, =Instruct_2 Instruct_2 ; Remap by setting remap bit of the control register ; Clear the DEVCHIP_Remap_bit by writing 1 to bit 8 of the control register LDR R1, =Versatile_ctl_reg LDR R0, [R1] ORR R0, R0, #DEVCHIP_Remap_bit STR R0, [R1] ; RAM is now at 0x0. ; The exception vectors must be copied from ROM to RAM ; The copying is done later by the C library code inside __main ; Reset_Handler follows on from here