链接脚本
SEC
tiONS {
firtst 0x00000000 : { head.o init.o nand.o }
second 0x30000000 : AT(4096) { main.o serial.o}
}
----------------------------------------------------------------------
汇编程序head.s
------------------------------------------------------------------------------------
.extern main
.text
.global _start
_start:
Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
bl clock_init @ 设置MPLL,改变FCLK、HCLK、PCLK
bl memsetup @ 设置存储控制器以使用SDRAM
bl nand_init
ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址
mov r1, #4096 @2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
mov r2, #2048 @3. 复制长度= 2048(bytes),对于本实验的main.c,这是足够了
bl nand_read @调用C函数nand_read
ldr pc, =on_sdram @ 跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 @ 设置堆栈
ldr lr, =halt_loop @ bl main
ldr pc, =main
halt_loop:
b halt_loop
-----------------------------------------------------------------
这个编译没有问题但是
改成下面就不可以
ldr pc, =on_sdram @ 跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 @ 设置堆栈
bl main
halt_loop:
b halt_loop
报错
: relocation truncated to fit: R_
ARM_PC24 main
原因是b跳转范围不够,
但是在前一句 ldr pc, =on_sdram ,这个时候pc已经跳转到了sdram,
从sdram跳转到main,为什么范围还不够?