用户模式(user模式),运行应用的普通模式;
快速中断模式(fiq模式),用于支持数据传输或通道处理;
中断模式(irq模式),用于普通中断处理。
超级用户模式(svc模式),操作系统的保护模式
异常中断模式(abt模式),输入数据后登入或预取异常中断指令
系统模式(sys模式),是操作系统使用的一个有特权的用户模式
未定义模式(und模式),执行了未定义指令时进入该模式
外部中断,异常操作或软件控制都可以改变中断模式。大多数应用程序都时是在用户模式下运行。进入特权模式是为了处理中断或异常请求或操作保护资源服务的。
这些工作模式是芯片硬件提供的程序运行的不同环境,不同的模式有不同的硬件访问权限,使用不同的寄存器。这就给不同的程序提供了不同的权限机制,你比如说你的操作系统代码运行在权限比较高的模式下,而你的应用程序运行在权限比较低的模式下。这样就起到了对操作系统代码的保护作用。
寄存器,各个模式下可见的寄存器以及各个寄存器的功能:
ARM共有37个32位的寄存器,其中31个是通用寄存器,6个是状态寄存器。但在同一时间,
对程序员来说并不是所有的寄存器都可见。在某一时刻存储器是否可见(可被访问),是处
理器当前的工作状态和工作模式决定的。其各个模式下的寄存器如图1所示:
其中系统模式和用户模式所用的寄存器是一样的。画三角阴影的寄存器表示在不同模式下
有不同的物理寄存器。
以下对其进行分类说明:
通用寄存器
ARM的通用寄存器包括R0~R15,其中R0~R7是属于未分组寄存器,各个模式下都使用同样的寄
存器。R8~R14在FIQ模式下是有独立的物理寄存器,其目的是加快中断响应速度,从硬件上
保存程序执行现场。R13和R14这两个寄存器在每种模式下都有自己的独立寄存器。R15只有
一个,所有模式公用。
下对这些寄存器中的比较有特殊功能的做一下介绍:
寄存器R13:在ARM指令中,常用R13做堆栈指针用。每种运行模式都有自己独立的堆栈,用于保存中断发生时的程序运行环境和C语言执行时进行过程控制。
寄存器R14:专职持有返回点的地址,在系统执行一条“跳转并链接(link)”(BL)指令
的时候,R14将收到一个R15的拷贝。其他的时候,它可以用作一个通用寄存器。相应的它
在其他模式下的私有寄存器R14_svc,R14_irq,R14_fiq,R14_abt和R14_und都同样用来保
存在中断或异常发生时,或时在中断和异常中执行了BL指令时,R15的返回值。
寄存器R15是程序计数器(PC)。在ARM状态下,R15的bits[1:0]为0,bits[31:2]保存了PC
的值。在Thumb状态下,bits[0]为0同时bits[31:1]保存了PC值。
FIQ模式拥有7个私有寄存器R8-14(R8_fiq-R14_fiq)。在ARM状态下,多数FIQ处理都不需要保存任何寄存器。用户、中断、异常中止,超级用户和未定义模式都拥有2个私有寄存器,R13和R14。允许这些模式都可拥有1个私有堆栈指针和链接(link)寄存器。
程序状态寄存器
ARM920T具有一个当前程序状态寄存器(CPSR),另外还有5个保存程序状态寄存器(SPSRs)用于异常中断处理。这些寄存器的功能有:
保留最近完成的ALU操作的信息;
控制中断的使能和禁止;
设置处理器的操作模式。
下图2显示了程序状态寄存器的位定义:
关于这些位的具体含义请参见。
异常:
当正常的程序执行流程因一些原因发生暂时的停止时,称之为异常。比如芯片取到了一条不认识的指令,当这条指令执行时就会发生Abort异常中止,从而进入Abort模式。也就是说不通的条件会发生不通的异常,而不同的异常就会使处理器进入不同的处理模式。
你想知道异常什么时候发生,怎么发生的?发生后芯片都要干些什么?怎么从这些异常中返回?异常向量表是什么?那就请你仔细阅读datasheet的第二章program’s model,这一章对这些问题都做了详细的说明和讲解。
当然,这些和后面的UCOS是有关系的,比如UCOS和用户的应用程序是统一编译的,都运行在SVC模式下,当外部中断来时会切换到中断模式。
请看下面的异常(中断)向量表:
地址 | 异常中断类型 | 进入时处理器模式 |
0x00000000 | Reset | Supervisor |
0x00000004 | Undefined instruction | Undefined |
0x00000008 | Software Interrupt | Supervisor |
0x0000000C | Abort (prefetch) | Abort |
0x00000010 | Abort (data) | Abort |
0x00000014 | Reserved | Reserved |
0x00000018 | IRQ | IRQ |
0x0000001C | FIQ | FIQ |
异常向量表是一个填好了的跳转指令表,中断向量表就位于内存地址的0开始处。当相应的异常发生时,CPU最后要把PC值改成向量表里的跳转指令实现跳转去执行相应的服务程序。当然这时CPU的运行模式就更改了。我们看IRQ中断异常,这个地址向量是外部中断的入口地址,那我们知道ARM9芯片上支持的中断源有很多,那中断入口就一个,怎么识别到底是哪一个具体中断源发生了那。这一部分知识就是中断控制器的内容了,请参加下面的文章或者参加datasheet的十四章interrupt controller。
关于更详细的资料请参考920t的datasheet!!!!!
关于arm中断系统请参考。和ucos相关的arm芯片知识讲完了,当然arm芯片知识还很多,参考920t的datasheet!!!!!
版权声明:本文为博主原创文章,未经博主允许不得转载。