资源描述:
《前段时间发了这个教程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、前段时间发了这个教程:http://www.armbbs.net/forum.php?mod=viewthread&tid=10423把标题定为教程实在是我自夸了点,其实应该算是我学习的总结吧,写份文档,自己以后忘了也有个参考,又可以帮助和我卡在同一个问题的新手,其实我也是新手,新手教新手,不知道会不会误导大家了...主要内容:一.简单原理介绍二.复制代码,建立并配置工程三.修改部分代码,四.测试结果一.简单原理介绍那个教程里面主要讲了一些简单的配置,原理没有仔细介绍,其实当时我也不太懂,当时看重的是实际效果,原理嘛,在我们从SB到NB的过程会慢慢理解的, 现在稍微理解了一
2、点,在写这篇教程之前简单介绍一下之前的存储器的地址配置的问题吧,也和等会移植的内容有关啦,耐心看吧:TQ2440开发板算起来应该是有3个片外存储器吧,一个是nandflash,一个是norflash,(这两个应该算是ROM了),还有一个SDRAM(就是RAM啦,SDRAM是个什么东西,还没学数电...不知道...)2440算是冯诺什么曼结构的计算机,通俗的说,2440的程序代码是可以放在RAM里面执行(我们的PC机也是这种类型的),不同于51,也许你会注意到,51的程序是不能在内部的RAM里面执行的,现在的51单片机的程序一般是存在片内的ROM里的,传统的51的内部RAM顶
3、多也就那么256个字节,变量都存不了几个,运行个鬼程序,51单片机算是哈佛结构的.(计算机基础不好,欢迎批评指正)其实我说这些只是为了说明...2440的程序代码是可以存放在SDRAM里面运行的.从汇编上讲,就是程序指针(PC指针,程序计数器,各种称呼,指向一下条要执行的程序代码的一个寄存器)可以指到SDRAM的内存单元.然后再说norflash,2440的程序也可以在norflash里执行,原因我不清楚.从norflash启动的时候,PC指向的0地址就是norflash的首地址,就是说norflash的首地址映射到内存的0地址, 对比一下SDRAM,SDRAM在2440是
4、映射到0x30000000地址然后是nandflash,nandflash也是映射到了0地址,为样就和norflash有冲突了,所以就有了从nor启动和从nand启动的区别了, 然后我又想说,其实nand本身是不能运行程序的(这里的意思是说,因为norflash本身为了容量大和本身的接口,是不能向CPU不断的快速的输送指令的,我的理解就是这样,大家可以去参考nor和nand的区别的资料),既然我说nand不能运行程序,那个地址映射有什么意义?是这样的,2440从nand启动的时候,它内部的nandflash控制器会把前4k的代码复制到内部的缓存去执行,而这些缓存就是对应地址
5、的0单元开始.(其实这个直接去参考2440datasheet上的地址映射会比看我在这里瞎说的强...)刚才说了从nand启动的时候是把前4k的代码复制到内部的缓存去执行的,nandflash的容量远远远远大于4K呀,不充分利用就太浪费了...如果你的程序超过4K了怎么办?很简单,你在前4K的程序里,利用什么for啊while之类的把剩下的代码复制到SDRAM里面去,复制完了以后后再用一条汇编指令ldr(用来跳转到绝对地址的,类似C语言的goto,但有点区别)跳到SDRAM里面继续执行,(因为前4K的代码在内部缓存运行的时候对应的地址是从0-4K的,SDRAM是的地址是从0x
6、30000000开始的,你不跳,就等着系统崩溃吧).刚才说的这些工作你可以自己写代码,也可以移植个bootloader来帮你做,操作系统就是从bootloader开始的...这部分我没学,不说了...那么ldr指令是怎么跳转的?在2440init.s里有这两句, ldrpc,=copy_proc_beg copy_proc_beg类似C语言的gotocopy_proc_begcopy_proc_beg:注意,我说的是类似,从汇编层面是讲,是有很大的不同的,我比较懒,就不详细解释了上面的ldr的作用就是:你的工程最后生成可执行的代码里面, copy_proc_beg 对应的地
7、址(绝对地址,就是说应该放在存储器的哪个位置),会被复制到PC指针,所以我们在nand启动的工程配置里,rom应该是这样的:srart(开始):0x30000000 size(大小,我这里是随便设置的):0x800000(抱歉,我之前的教程里的生成下载到nand的bin的那部分配置讲错了,当时并不理解,不过,小于4K的程序还是可以用的了^_^)这样,编译器生成以后,标号copy_proc_beg对应的地址是0x3*******,也就是在SDRAM里面,然后你在去年前4k的时候PC指针的内容是0x00000***,