ARM boot loader 的一段代码,如下 jump to ram 是怎么保证的呢?
=on_the_ram 是开始的那个‘steppingstone’缓存区 还是 SDRAM 的地址? 请教大家,谢谢
bl copy_myself
@ jump to ram //here********************
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
@ get read to call C functions
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
mov a2, #0 @ set argv to NULL
bl main @ call main
你的代码有点怪,2410的steppingstone没有这样的代码吧
————————————————————————————————————
steppingstone是2410硬件实现自动拷贝前4K flash数据到内部SRAM运行的。
on_the_ram 应该是内存。
引用: 引用 3 楼 gooogleman 的回复:
————————————————————————————————————
steppingstone是2410硬件实现自动拷贝前4K flash数据到内部SRAM运行的。
on_the_ram 应该是内存。
就是说steppingstone是一行代码都不用写,硬件实现了。
这是什么BOOT?反正不像WINCE的Eboot。
RAM是指SDRAM。将boot拷贝到SDRAM,然后跳转过去。
vivi里面的
我知道
steppingstone是一行代码都不用写,硬件实现了
这个bootloader开机运行后
有4k被2410硬件自动拷贝到了内部缓存ram中运行
然后这(开头的一段4k程序)又把整个bootloader(包括那四k)拷贝到sdram中去
我要问的ldr r1, =on_the_ram 这句,他的意思是跳到sdram中执行
通过上面可知道 包含on_the_ram 这个标号的代码
在内部缓存ram中有一个,(我们当前代码就在这里执行,执行了ldr,r1,=on_the_ram add pc ,r1,#0就到了下面sdram中了 )
在刚刚完成拷贝中sdram中也有一个,
我要问的就是它是如何保证跳到sdram中,而不是还留在这4k steppingstone 缓冲区中
on_the_ram这样的标志其实是以相对“起始点”的“偏移量”存在的。
在StepStone里时,“起始点”是StepStone的起点。
add pc,r1, #0已经到了sdram,这时“起始点”已经是sdram里面了,然后跳转就是以这个“起始点”找“偏移量”了,这样就确保是在sdram里面了。
引用: 引用 10 楼 andykuo 的回复:
唉 还是不明白啊
你关键理解这个PC,PC是是程序执行到哪里的老大,你这个PC的值变成内存之后,程序自然会执行内存里面的程序了。
这个和单片机等都是一样的。
引用: 引用 10 楼 andykuo 的回复:
唉 还是不明白啊
你关键理解这个PC,PC是是程序执行到哪里的老大,你这个PC的值变成内存之后,程序自然会执行内存里面的程序了。
这个和单片机等都是一样的。
on_the_ram假设处于偏移量0x1000的地方。
开始在stepstone的时候,这个on_the_ram实际处于stepstone的起始位置+0x1000的地方。
而当pc指向了sdram之后,再执行pc+0x1000,结果就是sdram里面的on_the_ram了。
汇编里的标识符都是偏移量,而不是绝对地址。