weiqi7777

基于S3C6410的ARM11学习(十二) 代码拷贝及led测试输入日志标题

0
阅读(2044)

                           

         之前已经将ddr进行初始化了,这样就可以使用ddr了。首先就要将代码从stepping stone拷贝到ddr中。最后在ddr中运行程序。如果外部nandflash还有剩余的程序,还要将剩下程序拷贝到ddr中。

         Stepping stone的起始地址是0x0c000000DDR的起始地址是0x50000000。在上电的时候,CPU会自动把NANDFLASH的前8K代码拷贝到stepping stone中。但是现在写的代码是比较小的,还没有超过4K。所以这里就设定拷贝的代码是前4K代码。

         这样,代码就比较好写了。

     clip_image002

R0保存的是stepping stone的起始地址,r1保存的是要拷贝的ddr的地址,这里地址是0x50008000,为什么不是0x5000_0000了。这个是因为链接脚本设定的链接地址就是0x50008000

clip_image003

在链接脚本中,设定的链接起始地址是0x50008000。之后的代码都是以这个地址作为起始地址进行链接。所以ddr的起始地址要设定为这个。这样的话,绝对跳转才能跳转成功。

clip_image005

上图是反汇编出来的代码。可以看到第一行代码的地址就是50008000

设置r3r0的地址加上1024*4,表示stepping stone4K大小代码处的地址。后面代码就是从stepping stone中取出数据,存在ddr中。地址依次加一。直到判断目前在stepping stone的地址和4K大小代码地址一样,就说明程序拷贝完毕。程序就返回了。

 


这样ddr初始化和代码拷贝的工作就结束了。下面就要对这个代码进行测试了,看看代码是否写的正确。简单的测试方法,就是将之前的流水灯的代码放到ddr初始化和代码拷贝代码之后。

clip_image006

把程序下到开发板中去,能看到灯是在不停的闪烁的。就说明ddr初始化和代码拷贝目前是没有问题的。

后面就要初始化c语言环境,也就是设置栈和对bss段清零。然后跳转到c代码去运行。