ARM处理器程序的执行流程种类
●正常执行:每执行一条ARM指令,程序计数器PC的值自动加4。这一过程描述了应用程序顺序执行的状态。
●跳转执行:通过B、BL跳转执行,实现程序在一定范围内的跳转执行。这一过程描述了ARM处理器程序执行过程中的过程调用。
●中断处理:在应用程序执行过程中,发生中断后,ARM处理器在执行完当前指令后,跳转到上述中断对应的中断处理程序处去执行,执行完中断处理程序后,再返回到发生中断的指令的下一条执行处接着执行。这一过程描述了ARM处理器对异常中断的响应情况。
S3C2440中断系统概述
在ARM处理器运行过程中,需要与系统的各类外部设备进行通信,包括发出控制信息、读取外部设备的状态信息以及采集数据等。完成上述功能有以下两种实现方法。
●查询方式:处理器不断地查询外部设备的状态,一般是每隔一段时间查询一次或者是始终在查询,这样做的缺点是实时性差、浪费处理器时间。
●中断方式:当外设状态发生变化时发送一个信号给处理器,处理器通过内部的控制逻辑找到具体的外部设备,然后对请求信息进行响应。在这种情况下,处理器的利用率大大提高,同时也提高了系统的实时性。
ARM处理器对中断第 处理流程基本符合下面的流程。
①中断发生后,中断控制器将中断请求发送给CPU
②CPU将当前程序的运行环境(程序的运行环境包括程序执行过程中使用的寄存器以及程序的返回地址等信息)保存,调用相应的中断处理程序。
③在中断处理程序中,识别具体是哪个中断发生,并进行相应的处理
④从中断处理程序返回,恢复被中断程序的运行环境,接着执行。
ARM处理器有7种工作模式,如下表所示
处理器模式 | 说明 |
---|---|
用户模式(User) | 程序正常执行的模式 |
快速中断模式(FIQ) | 用于高速数据传输 |
外部中断模式(IRQ) | 用于普通的中断处理 |
特权模式(Supervisor) | 操作系统使用的一种保护模式 |
数据访问终止模式(Abort) | 用于虚拟存储及存储保护 |
未定义指令终止模式(Udefined) | 用于支持通过软件仿真硬件的协处理器 |
系统模式(System) | 用于运行特权级的操作系统任务 |
ARM处理器的工作模式分为用户模式和特权模式,除用户模式外的其他6种工作模式为特权模式。此外,除用户模式和系统模式外的其他5种工作模式又称为异常模式。
ARM处理器的工作模式可以通过软件改变,也可以通过外部中断或异常处理来改变处理器的工作模式。大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。
除了软件切换工作模式外,还有没有其他方法呢?答案当然是 有!通过异常中断的方式也可以进入相应的工作模式。例如,当IRQ中断发生时,处理器就进入外部中断模式(IRQ模式)。
深入理解CPU的工作模式
ARM处理器共有37个寄存器(曾经面试官就问我这个了),其中包括31个通用寄存器和6个状态寄存器,这些寄存器都是32位的。AMR处理器的寄存器如下图:
ARM处理器共有7种工作模式,每种工作模式都有对应的寄存器,在程序执行过程中,ARM处理器肯定处于上述7种工作模式的中的一种,在该工作模式下可见的寄存器(即在该模式下可以访问的寄存器)主要有:15个通用寄存器(R0-R14)、程序状态寄存器(CPSR或者SPSR)、程序计数器R15(PC)。由上图可以看出,有些寄存器是各个模式公用的(也就是说,它们是同一个物理寄存器,因此当切换工作模式的时候,要保存这些寄存器的值),如R0-R7,有些寄存器是各个模式独自拥有的物理寄存器(如上图标黑色三角号的寄存器)。
当进行工作模式切换时,哪些寄存器的值需要保护呢?为什么快速中断模式比外部中断模式中断响应的速度要快?
假设ARM处理器处于用户模式(User模式)执行程序,在程序执行过程中,发生了外部中断,则处理器进入外部中断模式(IRQ模式),从上图可以看出,用户模式和IRQ模式的寄存器R0-R12是公用的,也就是说,在进入IRQ模式之前,在用户模式下可能使用到了寄存器R0-R12。如果在IRQ模式中也需要使用,那么寄存器R0~R12中的值将被更改,在IRQ模式执行完中断处理程序,返回到用户模式后,寄存器R0-R12中的值被破坏了。因此,在IRQ模式中,使用寄存器R0-R12之前需要将其中的值保存,当从IRQ模式返回到用户模式时将原来的值恢复就可以避免上述问题。
从上图还可以看出,用户模式下的寄存器R13-R14和IRQ模式的寄存器R13_irq、R14_irq不是同一个寄存器(R13_irq、R14_irq有个黑色小三角说明这两个寄存器是独立的寄存器),也就是说在每种工作模式中,这两个寄存器是独立的。因此,当从用户模式切换到IRQ模式时,不需要保存这两个寄存器的值。
此外,从上图还可以看到,用户模式和快速中断模式(FIQ模式)公用的寄存器是R0-R7,在FIQ模式中,R8_fiq~R14_fiq是独立的。因此,当从用户模式切换到快速中断模式(FIQ)时不需要保存这几个寄存器的值,只需要保存R0-R7的值即可。因此发生快速中断只需要保存R0-R7,共8个寄存器。但是,当发生外部中断时需要保存R0~R12共13个寄存器,这里讲的保存寄存器的值是通过将其值入栈实现的,入栈是需要时间的,因此快速中断的响应时间要快一些。
中断控制器
S3C2440中断控制器可以接受来自60个中断源的中断请求。对于ARM处理器而言,中断源很多,为了更好的处理各种中断,当中断发生时,中断请求并不是直接发送给CPU,而是发送给中断控制器(中断控制器需要用户进行初始化),中断控制器进行裁决后,选择出当前最需要处理的中断请求发送给CPU,这样可以降低CPU的负担。
S3C2440处理器的中断控制器结构如下图1所示:
有那么多的中断,咱们怎么入手呢?咱就从其中一个中断学习,学会之后举一反三吧!
1、中断从哪里来
学习中断只需要弄清楚这样的问题:从哪里来,到哪里去。即中断源是从哪里来的,中断发生后程序是如何执行的?
图1可以看出,中断的来源是Request sources(with sub-register)和Request sources(without sub-register)。
● Request sources(whith sub-register)主要处理以下类型的中断。例如,串口UART,UART中断包括发送中断、接收中断和因错误而产生的中断,但是这三个中断都属于一个大类,即都属于UART中断。如下图2所示展示了这类子中断的处理流程。当UART发送中断产生时,SUBSCPND寄存器中响应的位会置1,如果INTSUBMSK中不对其进行屏蔽,则SRCPND中的UART中断会置1。
同种设备可能会对应几种中断,S3C2440处理器采取的措施是:SRCPND存储的是大类的中断,具体这一大类中断中哪种类型的子中断发生了,需要再查询SUBSRCPND寄存器才能得到。
例如,SRCPND中的UART中断位置1了,说明发生了UART中断,但是具体是UART接收中断,还是UART发送中断或者是出错,在该寄存器中无法确定具体哪种类型的中断发生,因此还需要查询SUBSRCPND寄存器才能确定具体哪种类型的中断发生了。
● Request sources(without sub-register)主要处理以下类型的中断。例如,外部中断1,这种类型的中断只有一种情况,当外部中断的触发条件满足时就产生中断,这一类中断没有子类。
2、如何屏蔽中断请求信号
上面咱们说了中断“从哪里来”的问题。但是,并不是只要产生中断CPU就要对其进行响应,那么,如何使CPU不对某些中断进行响应呢?
最简单的情况是将该中断屏蔽掉。因此,这里就设计到中断屏蔽寄存器,只要向该中断屏蔽寄存器中的某一位写1,就可以将该位对应的中断屏蔽掉。
中断屏蔽寄存器有两个(其实还有一个专门用于处理外部中断屏蔽的寄存器,关于它将在咱们说外部中断实验部分讲解):寄存器INTSUBMSK和寄存器INTMSK。屏蔽中断请求信号,需要屏蔽某一大类的中断时,就需要用到寄存器INTMSK,屏蔽某一个子类的中断时就需要用到寄存器INTSUBMSK。
例1:屏蔽UART0中断
寄存器INTMSK共32位,每一位对应一种类型的中断,当向该位写1时,就可以将中断屏蔽,如图3所示。因此,要屏蔽UART0中断,只需要向寄存器INTMSK的第28位写1即可。
实现上述功能的代码如下:
#define INTMSK (*(volatile unsigned int *)0x4A000008)
INTMSK|=1<<28;
例2:只屏蔽UART0发送中断,但不屏蔽UART0接收中断
由前面的分析可以知道,要实现本例的功能,需要打开UART0总中断,然后只屏蔽掉UART0发送中断即可。这时,需要用到子中断屏蔽寄存器INTSUBMSK,该寄存器是32位的,但是高17位保留未用,只用到了第15位,每一位对应一种类型的子中断,如图4所示。
实现上述功能的代码如下:
#define INTMSK (*(volatile unsigned int *)0x4A000008)
#define INTSUBMSK (*(volatile unsigned int *)0x4A00001C)
INTMSK&=~(1<<28); //不需要屏蔽UART0总中断
INTSUBMSK|=1<<0; //只需要屏蔽UART0发送子中断
3、中断模式
寄存器INTMOD是中断模式寄存器,S3C2440处理器的中断分为一般的中断IRQ和快速中断FIQ,INTMOD寄存器的各位含义如图5所示。当INTMODE中某一位置1时,该位对应的中断被配置为快速中断模式。INTMOD如果不进行初始化,那么所有的中断默认的都是IRQ模式。
4、中断优先级
为了更好地响应各种类型的中断,S3C2440处理器内部还有中断优先级寄存器,用于配置不同中断的优先级,可以采用默认值即可。
下一节结合具体实验讲中断怎么执行,怎么利用中断。