其实学习这部分的时候,让我想起来了曾志文老师,他是我们的微机原理老师(一个学物理的,教过我们电磁学,信息论基础,微机原理,重点是都讲的非常好,很牛叉的一个人)。无论是ARM还是X86,关于存储控制器这部分的内容都是差不了太多的。
S3C2440的存储控制器总共有8个BANK,其中BANK0~BANK5可以支持外接ROM、SRAM等,但是BANK6~7除了支持ROM、SRAM以外,还支持SDRAM的,至于你外接的是哪一种,是要设置寄存器“告知”S3C2440的。
如果看原理图的时候,发现地址线只有27跟线,这样可访问的地址就是227,也就是128MB,但是再仔细看,还有额外的8跟片选信号,这样可访问地址就是128*8=1GB,每一个片选线对应一个BANK,其实这只是需要“了解”的内容,为什么这么说呢?因为你只要写地址,写数据,至于片选线和地址线上的高电平或者低电平都是硬件自动完成的,但是学习嘛,就要多知道一些,对基础概念的理解对于我们的后续学习是非常有帮助的。
S3C2440使用了存储控制器的六个BANK,分别接了NORFLASH、IDE接口、10M网卡CS8900A、100M网卡DM9000、扩展串口芯片16C2550、SDRAM。看到这里大家发现什么了没?NANDFLASH也和NORFLASH存储器啊,怎么没有它呢?去看一下原理图,发现NANDFLASH并没有连接地址线,这说明它的访问方式是不同的,这个放在后面再说。
存储控制器这一节的实例是操作SDRAM,在写程序以及调试的过程中有几个收获:
1> 在汇编代码中出现了一个新的东西, .equ
MEM_CTL_BASE,0X4800000000
这个东西应该和C语言中的宏定义是一样的,即:#define MEM_CTL_BASE 0X48000000
方便后面程序的修改,免得如果这个量多处使用的话,直接写在程序中的话,后续的修改就很麻烦了,而采用这种方式后续的修改就会方便很多。
2> 跳转指令
在ARM中,实现程序的跳转有两种方式,第一种就是使用专门的跳转指令,第二种就是直接对程序计数器PC写入跳转地址值。
跳转指令
B指令是最简单的跳转指令,一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算。
BL指令:BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。
BLX指令:BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。
BX指令:BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。
这里需要特别注意的就是相对跳转的概念,比如下面的程序:
B Lable
……
Lable:
……
我们假设Lable的地址是0X34,B Lable这条指令存储的地址并不是0X34,而是一个相对的值。下面的一种方式就是一种绝对的值了:直接对PC赋值!
SDRAM实例中有一句:ldr
pc,=on_sdram。这句话的意思就是跳转到on_sdram这个地址继续运行,那么on_sdram这个地址是多少呢?因为在编译的时候设置的代码段的基址是0X30000000,on_sdram是第5条指令,ARM模式一个指令是4个字节,所以on_sdram的地址应该是0X30000000+4*(5-1)=0X30000010,它的值会根据编译的时候-Ttext后面的那个值进行改变的,如果程序中间都是相对跳转的话,我目前还没有想到对程序有什么影响。并不是-Ttext后面的值为多少就把程序存储到那个空间,程序bin文件烧写到存储器里面肯定都是从0地址开始的,至于想把哪个文件存到bin文件的哪个地方,这个是链接的时候可以设置的。这个后续再说。
这一节最大的收获就是关于程序跳转这个概念上的理解。
|