您的位置:首页 > 其它

第2章第1节 ARM7芯片基本结构

2017-06-29 22:35 99 查看


目前更新到5.3节,请在
http://dl.dbank.com/c02ackpwp6下载5.3节的全部文档

 



第1节 ARM7芯片基本结构

ARM7芯片构架比较简单,32bits线性地址空间统一排列,任何地址都是唯一的,不同的片上资源及外设被分配到不同的地址空间,不同数据结构的指针固定为4字节长度,这相对51芯片来说方便很多也清晰很多,从用户编程的角度来看入手比较简单,因此本手册首先选用ARM7芯片来作为开发操作系统的硬件平台。选用的ARM7芯片,是ADI公司的一款芯片——Aduc7024。

Aduc7024具有片上AD、DA、GPIO、UART、I2C、SPI、TIMER、WDT、PWM等外设,具有62KBytes的内部FLASH程序空间和8KBytes的内部RAM空间,无需外挂ROM和RAM,芯片的具体细节可以查阅附录中的参考文档1。在我们的开发过程中,我们主要使用了芯片的UART,也就是串口,作为打印数据的端口,输出到PC上来观察操作系统的运行。

当我们完成了操作系统的一些基本功能后,我们会将Wanlix和Mindows移植到另外一款ARM芯片上——Cortex内核的ARM芯片,并在此芯片上继续完善Mindows的功能。这么做,第一是让读者了解wanlix和Mindows的移植过程,第二是让读者在移植过程中体会操作系统与用户代码无关的重要性,第三,Cortex内核芯片功能更强、资源更丰富,可以在此芯片上实现更多的功能。Cortex内核是ARM公司新推出的一种内核,其功能强大,性价比高,后面章节我们再详细讨论,我们首先来了解ARM7芯片。

 

ARM7支持7种处理器模式,分别是USR模式、SYS模式、SVC模式、ABT模式、UND模式、IRQ模式和FIQ模式,虽然有这么多种模式但可以归纳为2大类:正常工作模式和中断工作模式。

正常工作模式包括USR模式和SYS模式,USR模式没有任何特性,是芯片最常用的模式,芯片一般都是在USR模式下运行的。SYS模式与USR模式也没什么区别,仅比USR模式权限大些,能访问到芯片的特殊寄存器,适合操作系统使用(但我不知道怎么使用,本手册没有使用该模式)。

而中断工作模式又分为异常中断模式和正常中断工作模式。芯片无法正常运行时就会进入异常中断模式,芯片进入异常中断模式后软件就无法再继续提供原有功能了,异常中断模式仅是为定位问题而提供的。异常中断模式包括ABT模式和UND模式,指令或数据出错时就会进入ABT模式,例如,ARM模式下的一条指令是需要访问4字节对齐的地址,如果实际访问的地址不是4字节对齐的话,这时芯片就会进入ABT模式,程序PC指针就会跳转到ABT的异常中断向量,执行ABT的中断服务程序。如果用户为ABT模式编写了定位信息程序并挂到ABT异常中断上,那么就可以利用这些代码输出产生ABT异常的原因了。UND模式与ABT模式的工作原理是一样的,只不过UND模式是在遇到没有定义的指令时才会进入。

正常中断模式是为用户实现系统功能而设计的中断模式,它是预先设计好的,是系统运行所必须的。正常中断模式又分为IRQ模式、FIQ模式和SVC模式。IRQ模式就是普通的中断模式,当芯片产生中断时就会进入IRQ模式,等同于其它芯片的中断。FIQ是快速中断模式,它比IRQ中断优先级高,备份、还原中断现场时间更少些,也就是说能更优先更快速的产生中断,除此之外它与RIQ中断没什么区别。SVC是软中断模式,由软件触发,常用于操作系统中,软中断在本手册将会有非常重要的应用。
 



图 2  ARM7工作模式

程序可以看做是指令+数据的组合,程序运行的过程就是不断的取出指令并按照指令不断计算数据的过程,在这个计算过程中需要使用寄存器来存放指令和数据。寄存器与芯片内核直接相连,因此芯片操作它们的速度要远快于操作内存的速度。但寄存器的数量较少,因此指令和数据平时是存放在FLASH或者RAM中的,只有当使用时才会放入寄存器进行运算。

每种芯片内部都会有寄存器,不同芯片的寄存器种类、数量各不相同,但都会有下面这3种:一、PC(Program Counter)寄存器,PC寄存器中存放的是当前执行的指令所在的地址,芯片是通过PC寄存器找到其需要执行的指令的,更改PC寄存器就会发生指令跳转,当我们在C语言里调用函数或者产生分支跳转时,实际上就是通过改变PC寄存器的值实现的。二、状态寄存器,状态寄存器里都会有N、Z、C、V这4个状态标志,N用来表示数据是有符号数还是无符号数,Z用来表示0还是非0,C是进位标志,当产生进、借位时影响的就是这个标志,V是溢出标志,数据运算过程中产生数据溢出了就会更改此标志。三、通用寄存器,这些通用寄存器用来临时存放数据,供芯片运算时使用,某些通用寄存器也可能会有其它专有的功能,各个芯片的定义不一样。

ARM7芯片每种工作模式下有17个寄存器可以使用,分别是R0~R15和CPSR寄存器,
其中R15寄存器又可以称之为PC寄存器,CPSR是状态寄存器,其余的可以认为是通用寄存器,在这些通用寄存器里,R13和R14是比较特殊的,R13寄存器又可以称之为SP(Stack pointer)寄存器,用来指示当前堆栈的位置,R14寄存器又可以称之为LR(Link register)寄存器,当使用某些跳转指令时,硬件会自动将跳转前的指令存入LR寄存器中,以供返回时使用。
   
前面说了ARM7芯片有7种工作模式,有些寄存器是这7种模式共用的,但ARM7芯片也为每种不同的工作模式提供了专有的寄存器,进入不同模式便可以使用不同模式下的专有寄存器,如下图所示,ARM7芯片共有37个寄存器,但每种模式仅有17个寄存器可以使用。




图 3  ARM7工作模式与寄存器

图3中寄存器左下角不带阴影的是不可备份寄存器,各个模式共用,带阴影的是可备份寄存器,为每个模式所单独拥有,只有进入该模式才可以使用。

不可备份寄存器对各个模式来说是共用的,因此,为防止切换后模式破坏切换前模式中的数据,在模式切换后的需要使用软件将这些不可备份寄存器保存起来,当切换回原模式后再恢复这些不可备份寄存器。可备份寄存器则无需软件保存,硬件会在切换模式时自动将切换后模式下的可备份寄存器替换为切换前模式下的可备份寄存器,虽然名字一样,但实际上的物理空间是不同的,因此在不同模式下尽管使用了相同的可备份寄存器,但实际上并没有数据上的冲突,看下面的例子:

在USR模式下将R0和R13的值置为0:

MOV R0, #0

MOV R13, #0

此时,发生了从USR模式到IRQ模式的切换,然后在IRQ模式下将R0和R13加1:

ADD R0, R0, #1

ADD R13, R13, #1

R0是不可备份寄存器,因此上述操作是对同一个R0寄存器操作的。在USR模式下先将R0置为0,然后在IRQ模式下将R0加1,最后R0的值为1。而R13是可备份寄存器,在USR模式下先将USR模式下的R13置为0,进入IRQ模式后将IRQ模式下的R13加1,最后USR模式下的R13的值仍为0,而IRQ模式下的R13值在它原有的基础上加了1。在上述操作中,虽然软件使用的都是R13这同一个名字,但芯片会根据不同模式而对不同模式下的R13寄存器进行操作,上述对R13的操作就是对不同的2个R13寄存器进行的操作。

FIQ的可备份寄存器是R8~R14,其它模式的可备份寄存器是R13~R14,包括IRQ模式,因此切换到FIQ模式时需要备份的寄存器少一些,因此FIQ要比IRQ快一些。

 

CPSR寄存器不允许被软件随意改写,改写CPSR寄存器是需要权限的,只有特权模式,即非USR模式才可改写,CPSR寄存器的结构如下:




图 4  ARM7 CPSR寄存器结构
其中bits27~31为程序运行时的进位、溢出等标志,前面已经说过一些,具体含义请读者自行查阅附录中的参考文档2。bits0~4为芯片工作状态标志,对应关系为:




图 5  ARM7 芯片模式位

CPSR与R寄存器不同,所有模式下均是使用同一个CPSP寄存器,在模式切换时硬件会自动将切换前模式的CPSR寄存器保存到切换后模式的SPSR寄存器中,然后切换后的模式会继续使用CPSR寄存器作为自己的状态寄存器,当需要切换回原有模式时,硬件会自动将CPSR从当前模式的SPSR寄存器恢复过来。

 
ARM7芯片软件的运行完全是由上述的这些寄存器决定的,只要能合理的修改这些寄存器就能控制软件的运行,操作系统就是通过备份、还原、更改这些寄存器来控制程序执行流程的,进而实现任务之间的切换。由于C语言无法访问到这些寄存器,因此必须使用汇编语言才能对这些寄存器进行操作,下节我们将了解一些ARM7的汇编语言,以便理解操作系统的任务切换过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: