1、中断原理及应用-闵建有过裸机开发经验的工程师都很清楚中断的重要性。学习一款处理器,异常处理机制可谓是其精髓所在,而硬件中断又是异常处理中的一种很典型并且使用很频繁的情况。把握这一块内容需要大家明了两个方面的内容。(1) 处理器的异常处理机制(中断是处理器众多异常中的一种)(2) SOC 对中断的硬件支持(中断控制器)接下来以三星公司生产的基于 ARM 核为 CORTEX-A8 的SOC,型号为 S5PC100, 来阐述下中断的原理及使用。1. 中断的概念。中断,顾名思义,就是打断一个正在发生的事件。其中包括三方面的内容:1 是打断当前的事件;2 处理紧急事件 3 回到之前打断的事件继续执行。举
2、个简单的例子, 比如老师正在讲课,你有非常重要的事件需要老师帮你解决,于是你举手打断老师讲的内容去处理你的问题,老师解决了你的问题后又回到被打断前的内容接着往下讲。由这个简单的例子你可以看出来一个完整的中断流程需要注意几个方面的问题:1 必须有一种途径能打断正在进行的事件(如学生举手) ;2 打断后必须能顺利的去执行一个更为紧迫的事件(如果多个学生都有问题的话,势必要定位哪个问题是哪个学生提出的,并且还要考虑多个学生同时申请问题的情况)3 怎么顺利返回去(老师回到之前讲课的内容) 。1.1 中断的产生先来解决第一个问题也就是中断怎么发生的,图 1 经典 ARM 核内部框图上图为一款 ARM 核
3、内部框图,注意看标红的部分。ARM 核会引出两根线,一根为 IRQ 中断线,一根为 FIQ 中断线。由于 IRQ 跟 FIQ 在原理上相似,我们在这边不花篇幅去讲其区别,仅拿 IRQ来描述中断的原理。看到这里大家应该能明白什么情况下处理器核会接收到中断,注意仅仅是能接受到中断,能不能响应是另一码事。为什么这么说呢?CPU 核可能有的时候做的事情要比中断请求更为紧迫,比如刚加电做初始化的时候,这个时候如果这个管脚产生电平变化,可能 ARM 核也不会去管,也就是说在 ARM 内部把中断的功能给禁止掉。事情确实如此,ARM 在加电运行时,通常 CPSR 的 F 位 I 位的初始化状态是 1,也就是中
4、断/ 快中断是禁止了的。如果你要想用中断或者快中断怎么办? 当然要将 F 位 或者 I 位清零。当然还要明确一个问题,就是谁去让 IRQ 线产生电平变化,换句话来讲,就是谁去申请中断?答案当然是那些等不及了的外设。这些外设普遍的特征就是它们的事件要求 CPU 核来及时处理。但是现在又有问题了,刚才看到的 ARM 核的 IRQ 线就单单的一根,难道一个处理器能支持发生中断的外设只能有一个么? 答案当然是否定的,但是如果有多个外设的话,这些外设如何和 ARM 相连接呢?还有就是 IRQ 线上有电平变化了,ARM 如何知道是哪个外设激发的这种电平变化呢? 这个时候中断控制器就应需而产生了。有了中断控
5、制器后,一款基于 ARM 的 SOC 可以大致用以下框图描述。1234567891 01 11 21 31 41 50A R M 核I R Q 线U A R TR T C T I C KA D CI 2 C中 断 控 制 器G P H _ 0 / T XG P H _ 1 / R XE I N T 0E I N T 1E I N T 2E I N T 3S O CC H 0C H 1图 2 中断控制器描述图如上图所示,SOC 里面有一个支持 16 个中断源(即能申请中断的外设)的中断控制器,每一个外设与中断控制器都有一根中断请求线相连。如果相应外设想申请中断,对应管线上必定会有请求信号产生。细
6、心的朋友可能会发现,除了对应片内外设有线和中断控制器连接以外(对应的片内外设如 UART ADC 等想申请中断,对应线上就需要有请求信号产生) ,还有一部分线是从中断控制器直接引出到 SOC 外面的芯片管脚上,这部分叫做外部中断管脚,可以灵活的连接一些外部设备的中断请求线(如仅仅是一个外部的按键) ,并且这根线上的中断请求信号可以自定义,如定义成高电平为有效中断请求信号(也就是这根线上有高电平信号才能送给中断控制器) ,或者是低电平、上升沿、下降沿、双边沿等等。其实在一个片上系统(SOC)里,每一个中断源连接中断控制器的线是按照一定的顺序划分好的,也可以理解为系统给每一个中断源都分配一个号,也
7、就是常说的中断号。我们再细致深入的来看中断信号是怎么从外设送到中断控制器里(以 S5PC100 为例) 。S5PC100 芯片手册第四章讲中断控制器的内容,S5PC100 有三路VIC ,可以理解为其中断控制器分为三个中断控制模块,其实是为了好管理,因为 S5PC100 共支持 94 个中断源,有些寄存器用一位去描述某个中断源的某种功能,如禁止使能当前中断源,如标识对应中断线是否产生中断或者这个中断申请是要通过 IRQ 线送给ARM 还是 FIQ 线送给 ARM 等等。而 S5PC100 的寄存器统统为 32 位的,所以 94 个中断源至少得 3 组(一组中有多个寄存器来决定中断线的某种功能或
8、者状态)寄存器来描述。中断源对应的中断号(中断线编号) 。大家可以清楚的看到处理,片内外设的中断线在中断控制器里对应的连接编号。如果你要想通过 VIC(中断控制器)控制一个外设,首先查上面这个表,找到其中断号,然后去看中断控制器中的寄存器对应哪位来控制这个中断。如果你需要在片外连接一个外设,并且这个外设也需要申请中断怎么办呢?对了,用外部中断管脚。也就是上图对应的从 0 号到 16号中断源,其中需要注意到是有 16 根中断管脚共用一根中断请求线,怎么共用呢?我们来看下图 3。V I C 0 _ I N T E N A L B ES T _ 3 1. . .S T _ 1S T _ 0V I C
9、 0 _ I N T S T A T U SE N _ 3 1. . .E N _ 1E N _ 0V I C 1 _ I N T S T A T U SV I C 2 _ I N T S T A T U SE N _ 3 1. . .E N _ 1E N _ 0E N _ 3 1. . .E N _ 1E N _ 0S T _ 3 1. . .S T _ 1S T _ 0S T _ 3 1. . .S T _ 1S T _ 0V I C 1 _ I N T E N A L B EV I C 2 _ I N T E N A L B EV I C 0 V E C T P R I O R I T
10、Y 1优先级判决V I C 0 V E C T P R O R I T Y 2V I C 0 V E C T P R I O R I T Y 0V I C 0 V E C T P R I O R I T Y 1V I C 2 V E C T A D D R 1V I C 2 V E C T A D D R 3 1V I C 2 V E C T A D D R 0V I C 1 V E C T A D D R 1V I C 1 V E C T A D D R 3 1V I C 1 V E C T A D D R 0V I C 0 V E C T A D D R 0V I C 0 V E C T
11、A D D R 3 1V I C 0 V E C T A D D R 0V I C 2 A D D R E S S V I C 1 A D D R E S S V I C 0 A D D R E S SC O R T E X - A 8I R QF I QE I N T 0E I N T 1M K 3 1. . .M K 1M K 0P D 3 1. . .P D 1P D 0. . . . .E I N T 1 6- 3 1功 能 寄 存 器M a s k P e n dE I N T 0E I N T 1E I N T 1 6E I N T 3 1 . .U A R T 0 模 块U A
12、R T 0M A S K P e n d . .21032103R XE R R O RT XM O D E M图 3 中断控制器我们看图 3 外部中断管理模块,从 SOC 共有 32 个管脚引出来,这些管脚是复用的,可以配置成通用输入/输出 IO,也可以配置成唤醒中断的模式(及内部会连接到中断控制器电路) 。GPIO 模块内部有三个寄存器对这 32 根管线的中断功能进行管理。(1)功能寄存器 如图,对管脚的电平激发方式进行管理,可以配置成高电平激发中断,低电平 、上升沿 、下降沿、双边沿等。(2)Mask 寄存器 外部管脚 EINT16 到 EINT31 共 16 根线共用一根线 EINT(
13、16-31)连接到中断控制器,也就是共用一个中断号(中断号 16) ,可能需要在某一个时刻只能有一根管脚线的信号通过模块顺利进入中断控制器,这个时候就需要将其余的管脚信号屏蔽起来,如何屏蔽呢?就是设置 mask 里的对应位。(3) Pend 寄存器 记录中断信号标志。如果信号通过了前面的关口,送入了 VIC,就是将对应线上的 pend 寄存器的对应位值 1,如果在某一时刻,中断控制器来不起处理当前信号线上的中断请求,那么 pend 位会一直保持着这个请求,哪怕硬件中断线上的中断激发状态已经过去。同样,需要注意是,如果当前线上的中断已经处理,这个 pend 位也不会自动清零,需要人为的清零。下面
14、给这部分局部放大,大家可以仔细体会下,pend,mask 寄存器的作用。V I C 0 _ I N T E N A L B ES T _ 3 1. . .S T _ 1S T _ 0V I C 0 _ I N T S T A T U SE N _ 3 1. . .E N _ 1E N _ 0V I C 1 _ I N T S T A T U SV I C 2 _ I N T S T A T U SE N _ 3 1. . .E N _ 1E N _ 0E N _ 3 1. . .E N _ 1E N _ 0S T _ 3 1. . .S T _ 1S T _ 0S T _ 3 1. . .S
15、T _ 1S T _ 0V I C 1 _ I N T E N A L B EV I C 2 _ I N T E N A L B EV I C 0 V E C T P R I O R I T Y 1优先级判决V I C 0 V E C T P R O R I T Y 2V I C 0 V E C T P R I O R I T Y 0V I C 0 V E C T P R I O R I T Y 1E I N T 0E I N T 1M K 3 1. . .M K 1M K 0P D 3 1. . .P D 1P D 0. . . . .E I N T 1 6- 3 1功 能 寄 存 器M a s k P e n dE I N T 0E I N T 1E I N T 1 6E I N T 3 1 . .U A R T 0 模 块U A R T 0M A S K P e n d . .21032103R XE R R O RT XM O D E M图 4 子中断 mask、pend 寄存器中断信号请求的流程是1 使外设有中断激发的功能(如果为外部中断,设置电平激发方式) 。