@******************************************************************************
@ File:head.s
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@******************************************************************************
.text
.global _start
_start:
@函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定义
ldr sp, =4096 @设置堆栈
bl disable_watch_dog @关WATCH DOG
bl memsetup @初始化SDRAM
bl nand_init @初始化NAND Flash
@将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中
@nand_read_ll函数需要3个参数:
ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址
mov r1, #4096 @2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
mov r2, #1024 @3. 复制长度= 1024(bytes),对于本实验的main.c,这是足够了
bl nand_read @调用C函数nand_read
ldr sp, =0x34000000 @设置栈
ldr lr, =halt_loop @设置返回地址
ldr pc, =main @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转
halt_loop:
b halt_loop
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ldr sp, =4096 @设置堆栈
1.当设置sp=4096后,sp指针指向地址0x00001000。按第142页画的图可以知道,sp是指向存储空间的最后一个数据单元,所以说这是一个满栈,这点对吗?如果对的,我自己的理解堆栈是一个存储空间,既然是存储空间,那么必然有存储空间的起始地址和结束地址。根据满栈这个条件,可以知道这个存储空间的结束地址是0x00001000,按第142页画的图,这个堆栈的存储空间是0x00000000-0x00001000,那么怎么知道这个起始地址就应该是0x00000000呢?
2.如何在编程中确定堆栈的类型?满栈,空栈,降序,升序?
3. mov r1, #4096 @2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处 //这句怎么就知道main.c的代码都存在NAND Flash地址4096开始处呢?
SECTIONS {
firtst 0x00000000 : { head.o init.o nand.o}
second 0x30000000 : AT(4096) { main.o }
}
0x00000000 指定了first部分的运行地址,0x30000000指定second部分的运行地址。AT(4096)指定了main.o在编译生成的映像文件中的地址。这里的运行地址不一定在程序下载到开发板上就立即在这个地址上运行了,只是指定下地址而已。