就先叫笔记吧

来源:互联网 发布:mysql控制台删除用户 编辑:程序博客网 时间:2024/05/31 19:39

CPU数据手册


 

第二章 处理器模式

1、arm920t可以工作在两种工作状态:Arm状态和Thumb状态。ARM状态执行32位字对齐的指令,thumb状态执行16位半字对齐的指令,到底执行哪半字,由PC寄存器的第一位来选择。这两种状态的转换不影响处理模式和寄存器的内容。

2、切换状态:进入Thumb状态,通过执行BX指令,同时将操作数寄存器(PC--R15)的状态位(0位)置1来实现。当从异常(irq,fiq,undef,abort,swi)返回时 ,只要进入异常前是Thumb状态,则也会自动进入Thumb状态。进入ARM状态和进入Thumb状态一样,也bx,也操作数寄存器的状态位清零。当进入异常,pc值保持在异常的link寄存器中,并从异常向量地址处开始执行处理程序。

3、存储空间的格式:Arm920t将存储器空间视为从0开始由字节组成的线性集合,字节0-3保存的第一个字,4-7保存的第二个字,依次类推。Arm920t对存储器的字,可以按照大端或是小端的方式对待。大端:数据的高字节放在内存的低地址处,低字节放在高地址处,比如硬盘的数据存储。

4、指令长度:指令可以是32(ARM)、16(thumb)位长度。

5、arm有7种工作模式:usr,fiq,irq,und,abt(存取异常时)svc(当复位或是软中断时;供操作系统使用的一种保护模式,也叫超级用户模式),sys。外部中断,异常操作或软件控制都可以改变中断模式。大多数应用程序都是在用户模式下进行,进入特权模式是为了处理中断或是操作保护资源服务的。

6、寄存器:arm共有37个32位的寄存器,其中31个是通用的,6个是状态寄存器。但同一时间内,并不是所有的寄存器都对程序员可见。对程序员是否可见,取决于arm的工作状态和工作模式。

     (一)Arm状态的寄存器

     在Arm状态下,任何时刻都可以看到16个通用寄存器,1个或2个状态寄存器。在特权模式(非用户模式)下,会切换到具体模式下的寄存器组(包括模式专用的似有寄存器)。下图2-3显示了在每个模式下哪种寄存器是可见的,似有寄存器上都标有一个黑三角。

arm寄存器

       arm状态寄存器系列中有16个直接操作寄存器:r0-r15。除了r15外其他都可以用来存储数据和地址值。除此之外,实际上有17个寄存器用来存放状态信息。

http://hi.csdn.net/attachment/201011/12/8629467_1289530300Q8Tt.png

     Fiq拥有7个似有寄存器(R8-fiq,R17-fiq)。在arm状态下,多数Fiq处理都不需要保持任何寄存器。用户,中断,异常终止,未定义模式都拥有2个似有寄存器,R13-R14。允许这些模式都可以拥有1个似有堆栈指针,和1个链接寄存器。

        (二)Thumb状态下的寄存器

          Thumb状态寄存器是arm状态寄存器的一个子集。程序员可以直接操作8个通用寄存器R0-R7,同样可以操作PC,SP,LR和CPSR。他们都是各特权模式下的似有寄存器、链接寄存器、程序状态寄存器spsrs。

http://hi.csdn.net/attachment/201011/12/8629467_1289531177IQVZ.png

          在Thumb状态下R8-R15并不是标准的寄存器集,但是汇编程序员可以访问它们并用他们做快速暂存。

7、程序寄存器状态:arm920t具有一个当前程序状态寄存器(cpsr),另外还有5个保存程序状态寄存器(spsrs)用于异常中断处理。这些寄存器的功能是:保存最近完成的ALU(算术逻辑单元)操作的信息;控制中断的使能和禁止;设置处理器的操作模式。下图显示了状态寄存器的位定义:

http://hi.csdn.net/attachment/201011/12/8629467_1289531859c458.png

      (一)状态码标志:N、Z、C、V均为条件码标志位,他们的内容根据算术或是逻辑运算的结果所改变,并且来作为一些指令是否运行的检测条件。Arm状态下的下的绝大多数指令是条件运行的。Thumb状态下,仅有分支指令是条件执行的。

      (二)控制位:PRS的低八位称为控制位,当发生异常时,这些位将改变。如果处理器工作在特权模式下,这些位可以由软件操纵。

http://hi.csdn.net/attachment/201011/12/8629467_1289532587Zjlv.png

      (三)PSR模式位的值

http://hi.csdn.net/attachment/201011/12/8629467_1289533520r0WY.png

 

8、异常:当正常的程序执行流程被临时中断时,称为产生异常。例如程序执行转向了一个外设的中断请。在异常能被处理前,当前处理器状态必须保留,这样中断处理程序完成时就能恢复原始程序。有可能同时出现好几个异常,如果出现这种情况,就应该按固定的顺序处理。

    当一个异常发生时,aRm920t将进行以下步骤:1、将下一条指令的地址保存到相应的link寄存器中。如果异常是从arm状态进入的,下一条指令的地址拷贝到Link寄存器(根据异常的类型,数值为数值为当前PC+4或PC+8,具体看2-2表)。如果异常时从Thumb状态进入,则link的值是当前PC偏移一个值。这表示异常处理程序不需要关心是从哪种状态进入异常的。例如,在swi情况下,无论是来自arm或thumb状态,处理程序只要采用 MOVS PC,R14_svc语句,总可以返回到原始程序的下一个语句。2、复制CPSR到适当的SPSR。3、根据异常类型强制改变CPSR模式的位。4、令PC的值指向异常处理向量所指向的下一条指令。 这时也可以设定中断禁止,以防止不可估计的异常嵌套。当处理器处于Thumb状态时发生了异常,当PC载入异常向量所在的地址时,它将自动切换到arm状态

    离开异常处理时的行为:1、将link寄存器,减去相应的偏移量,付给PC(偏移量的值由异常的类型决定);1、将SPSR考回CPSR。3、如果在进入中断时设置了中断禁止标志,清楚它。你不需要指明返回到Thumb状态,因为原来的CPSR被自动的保存到了SPSR中了。表2-2总结了进入到异常时,保留到R14_x中的PC值,和退出异常时推荐使用的语句。

http://hi.csdn.net/attachment/201011/12/8629467_12895382277xZu.png

NOTES:
1. Where PC is the address of the BL/SWI/Undefined Instruction fetch which had the prefetch abort.
2. Where PC is the address of the instruction which did not get executed since the FIQ or IRQ took priority.
3. Where PC is the address of the Load or Store instruction which generated the data abort.
4. The value saved in R14_svc upon reset is unpredictable.

9、FIQ:fiq异常是用来支持数据传输和通道操作的。fiq是中断是由外部设备通过拉低nFIQ引脚触发的。通过对ISYNC输入引脚的控制nFIQ可以区别同步或异步的传输情况;当ISYNC为低电平时,nfiq,nirq将被认为是异步的,中断之前产生同伴周期的话会影响处理器的流程。

10、IRQ:irq异常是由nIRQ输入引脚输入地电平触发的 。

11、异常中断向量:如图

http://hi.csdn.net/attachment/201011/12/8629467_128954058619pS.png

12、异常中断的优先级:1、复位。2、数据abort。3、fiq。4、irq、5、预取指abort。6、未定义指令,SWI。

13、复位:当nRESET信号为低,arm920t放弃任何指令的执行,并从增加的字地址处取指令。当nRESET指令再次为高电平时,ART920t执行如下操作:1、将当前pc值写入R14_svc,将CPSR写入SPSR_svc,已保存的pc和cpsr的值是未知的。2、强制M[4:0]为10011(超级用户模式),将cpsr中的“I”“F”位置1,将“T”位清零。强制PC从0x00处取下一条指令。4、恢复为ARM状态并执行。


存储控制器

 

1、  s3c2440的“存储控制器”提供了访问外部设备所需的所有信号。

2、  存储控制器的寄存器:共有13个。Bank0~bank5只需设置bwsconbankconx1~5)两个寄存器;bank67外接sdram时,除bwsconbakcon67外还有refreshbanksizeMRSAB6MRSAB7四个寄存器。

a)         BWSCON(位宽和等待控制寄存器): BWS中每4为控制一个bank,最高位代表板块7,以此类推。  STx位(启动/禁止sdram的数据掩码引脚,sdram0,对于sram1,WSx(是否使用存储控制器的wait信号,通常为0)DWx使用两位来设置相应bank的位宽,(8位:0b0016位:0b01,32:0b10)。对于bank0比较特殊,它么有ST0WS0DW02:1)只读,通过硬件跳线决定。01:16位。10:32位,我估计是通过是否由nandflash引导那个跳线决定的。

b)        BANKCONxbank控制寄存器),bank0-5的值可以采用复位值0x0700bank67比较特殊,它的复位值是0x18008。要根据实际去该,具体惨见2440和所用芯片数据手册。

c)        REFRESH(刷新控制寄存器):初始值位0xac0000。在《嵌入式linux应用开发》所用开发板的值设为的是:0x8c0000

d)        Banksize(根据最后两个bank的大小而定),mrsrb6mrsrb7

3、  TE2440开发板里,使用的uboot做为bootloader时,在u-boot-1.3.4/board/.fl2440/lowlevel_init.S中对本节述的存储控制器对13个寄存器做了相应的设置。在TE2440自己做的带USB下载功能的bootloader(该的vivi)里,这些参数是在2440bootV4_090520/src/2440init.s里设置的(注:对nand的分区是在2440bootV4_090520/src/nand.c里设置的)。

 

 

 

 

 

 


 vivi移植

阶段1

阶段1从程序arch/s3c2410/head.S开始,按照head.S的代码执行顺序,一次完成了下面几个任务:
1、关WATCH DOG (disable watch dog timer)
上电后,WATCH DOG默认是开着的
2、禁止所有中断 (disable all interrupts)
vivi中不会用到中断,中断是系统的事,bootloader可不能去干这事的(不过这段代码实在多余,上电后中断默认是关闭的)
3、初始化系统时钟(initialise system clocks)
启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。
4、初始化内存控制寄存器(memsetup)
S3c2410共有15个寄存器,在此开始初始化13个寄存器。
5、检查是否从掉电模式唤醒(Check if this is a wake-up from sleep)
若是,则调用WakeupStart函数进行处理。
6、点亮所有LED (All LED on)
点一下灯,通知外面的同志,告诉他们有情况发生。
7、初始化UART0 (set GPIO for UART & InitUART)
a.设置GPIO,选择UART0使用的引脚
b.初始化UART0,设置工作方式(使用FIFO)、波特率115200 8N1、无流控等。这可是使用串口与s3c2410通信的条件啊,在终端也要如此设置。
8、跳到内存测试函数(simple memory test to find some DRAM flaults)
当然要定义了CONFIG_BOOTUP_MEMTEST这个参数才会跳到内存测试。
9、如果定义了以Nand flash方式启动(#ifdef CONFIG_S3C2410_NAND_BOOT),则此时要将vivi所有代码(包括阶段1和阶段2)从Nand flash复制到SDRAM中(因为在Nand flash中是不能执行程序的,它只能做为程序和数据的存储器,而Nor flash可就不同了,Nor flash可以执行程序,但贵是它发展得瓶颈):
a.设置nand flash控制寄存器
b.设置堆栈指针
c.设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=复制的长度(以字节为单位)
d.调用nand_read_ll进行复制
  10、跳到bootloader的阶段2运行,亦即调用init/main.c中的main函数(get read to call C functions)
a.重新设置堆栈
b.设置main函数的参数
c.调用main函数
head.S有900多行,都是些arm汇编,看的云山雾罩,汇编看来是忘的差不多了,所以这部分代码也看的相当糙,只知道大概在干什么,至于个中缘由就不是很了解。先学学arm汇编再回来看。