bootloader疑问
初学2410,尝试写了一个BOOTLOADER。可在stage1跳转stage2的时候出现问题。代码如下:
stage1用汇编写的,代码就是初始化CPU等等,最后用
b main
进行跳转
lds代码:
SECTIONS
{
firtst 0x00000000:
{
head.o
copy_myself.o
}
second 0x33f00000:
AT(4096)
{
main.o
*.o
}
}
makeflie代码:
kboot: head.S nand_flash.c string.c uart.c main.c
arm-linux-gcc -g -c -o head.o head.S
arm-linux-gcc -g -c -o nand_flash.o nand_flash.c
arm-linux-gcc -g -c -o string.o string.c
arm-linux-gcc -g -c -o uart.o uart.c
arm-linux-gcc -g -c -o main.o main.c
arm-linux-ld -Tboot.lds -g head.o nand_flash.o string.o uart.o main.o -o kboot.o
arm-linux-objcopy -O binary -S kboot.o kboot
clean:
rm -f *.o
rm -f kboot
编译器使用的是arm-linux-gcc 3.4.1
fc6 LINUX
提示错误:
arm-linux-ld -Tboot.lds -g head.o nand_flash.o string.o uart.o main.o -o kboot.o
head.o(.text+0xa4):/root/workspace/kboot/head.S:89: relocation truncated to fit: R_ARM_PC24 main
我用 ldr pc, =main
能编译通过。不过不能跳转,我的stage2就是打印一个o.
那位高手帮帮忙。谢谢。
[ 本帖最后由 jlu3389 于 2007-7-24 15:24 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
可能是寻址范围问题。
我无法用JTAG调试,也没有仿真器。
所以不知道那里寻址错误。
b指令系列的寻址范围为当前指令的+-32M。如果你指令的跳转跨度大于32M,可用大范围寻址指令,或直接向pc赋值。
我尝试过给PC寄存器赋值,编译通过,可烧写到板子上还是没有反映,这里我可以肯定驱动方面没有问题,因为我曾经尝试使用vivi的lds,结果是bl main可以成功跳转,可在我再增加string.c的时候提示 no enougth room ,我不知道为什么了。
寻址范围大于了32M,所以直接用b main是不能实现的,所以只能通过改变pc来实现
还有一个方法就是,在bl main之前就跑内存,而不是片内ram中跑.但是还是需要通过改变pc来实现