在从nand copy代码到ram的实验中,ld脚本是这样的
SECTIONS {
firtst 0x00000000 : { head.o init.o nand.o}
second 0x30000000 : AT(4096) { main.o }
}
编译链接后,程序正常跳转到main并运行
我现在想只有一个输出段,于是改了ld脚本
SECTIONS {
. = 0x30000000;
.init : AT(0){
head.o
*.o
}
}
head.S中的nand_read的参数也做了相应修改
_start:
mrs r0,cpsr @set cpu to SVC32 mode
bic r0,r0,#0x1F
orr r0,r0,#0xD3
msr cpsr,r0 @cpsr=11x10011, IRQ/FIQ disabled
@函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定义
ldr sp, =4096 @设置堆栈
bl disable_watch_dog @关WATCH DOG
bl clock_init
bl memsetup @初始化SDRAM
bl nand_init @初始化NAND Flash
bl ledsetup @点亮led5
@将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中
ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址
mov r1, #0x0 @2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
mov r2, #4096 @3. 复制长度= 1024(bytes),对于本实验的main.c,这是足够了
bl nand_read @调用C函数nand_read
bl led6_on
ldr sp, =0x34000000 @设置栈
@ldr lr, =halt_loop
ldr pc, =main
编译链接烧到板子,只能运行到bl led6_on,不能跳到main
再等几分钟,一个led都不亮了,连最初的led_setup那里都运行不到。
想不明白哪里出问题了,高手指点下!谢谢。