2# embedsky_lxt
复位后大家都知道PC是指向0的,就是处理器从0地址处开始取指令(这句话不知道对不对)。书上说虚拟地址由编译器和连接器在定位程序时分配,请问:
虚拟地址是根据什么分配的,是ADS中的RO base吗?如果不是那是怎么分配的?
如果虚拟地址确实是按照链接地址分配的,即虚拟地址的首地址就是RO base的地址值,那么在没有使用MMU的情况下,使用平板存储方式,即虚拟地址就是等于物理地址,那么在执行程序的时候如果程序是烧写到NAND中的,复位后PC指向0地址处代码,处理器是从0地址处取指令,还是从虚拟地址开始处取指令?
如果复位后处理器是从0地址处开始取指令,且我把R0 base的地址设置成0x30000000,程序烧写到NAND中,那么我想问的是:除了跟PC有关的跳转指令外是不是其它所有指令都能够执行呢?因为我是烧写到NAND中的,且PC是从0地址处开始的,只要没有PC的跳转指令,就不会跳到0X30000000开始的某个地址处去执行指令。
我疑惑的是复位后处理器到底是从0地址处取指令运行,还是从RO base地址处取指令运行。
我已经验证过了,只要不是个PC 有关的跳转指令,都是从0地址以后的地址执行的,而不是跳到RO base地址开始后的某个地址处执行,所以我可以下结论:对于RO base的地址设置,如果要从此地址处开始执行,只能使用PC跳转指令跳到SDRAM中执行,对吗?验证过程如下:
原程序:
MEM_CTL_BASE EQU 0x48000000
SDRAM_BASE EQU 0x30000000
IMPORT main
AREA HEAD, CODE, READONLY
ENTRY
bl disable_watch_dog
bl memsetup
bl copy_steppingstone_to_sdram
ldr pc, =on_sdram
on_sdram
ldr sp, =0x34000000
bl main
halt_loop
b halt_loop
disable_watch_dog
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr
copy_steppingstone_to_sdram
ldr r1, =SDRAM_BASE
ldr r2, =SDRAM_BASE
mov r3, #4*1024
mov r0, #0
1
ldr r4, [r1],#4
str r4, [r2],#4
add r0, r0, #4
cmp r0, r3
bne %B1
mov pc, lr
memsetup
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val
add r3, r1, #52
1
ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne %B1
mov pc, lr
ALIGN 4
mem_cfg_val
DCD 0x22011110
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00018005
DCD 0x00018005
DCD 0x008C07A3
DCD 0x000000B1
DCD 0x00000030
DCD 0x00000030
END
改动后的程序:即把bl memsetup直接用子程序代替。用红色字体显示
MEM_CTL_BASE EQU 0x48000000
SDRAM_BASE EQU 0x30000000
IMPORT main
AREA HEAD, CODE, READONLY
ENTRY
bl disable_watch_dog
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val
add r3, r1, #52
1
ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne %B1
bl copy_steppingstone_to_sdram
ldr pc, =on_sdram
on_sdram
ldr sp, =0x34000000
bl main
halt_loop
b halt_loop
disable_watch_dog
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr
copy_steppingstone_to_sdram
ldr r1, =SDRAM_BASE
ldr r2, =SDRAM_BASE
mov r3, #4*1024
mov r0, #0
1
ldr r4, [r1],#4
str r4, [r2],#4
add r0, r0, #4
cmp r0, r3
bne %B1
mov pc, lr
memsetup
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val
add r3, r1, #52
1
ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne %B1
mov pc, lr
ALIGN 4
mem_cfg_val
DCD 0x22011110
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00018005
DCD 0x00018005
DCD 0x008C07A3
DCD 0x000000B1
DCD 0x00000030
DCD 0x00000030
END |