1.间断概述
CPU与外设的数据传输方法一般有以下3种方法:查询方法、间断方法、DMA方法。
所谓查询方法是指,CPU不到查询外设的状况,假如外设准备就绪则开端进行数据传输;假如外设还没有准备好,CPU将进入循环等候状况。很显然这样浪费了很多的CPU时刻,降低了CPU的利用率。
所谓间断方法是指,当外设准备好与CPU进行数据传输时,外设首要向CPU宣布间断恳求,CPU接纳到间断恳求并在必定条件下,暂时刻断本来的程序并履行间断服务处理程序,履行完毕今后再回来本来的程序持续履行。由此可见,选用间断方法避免了CPU把很多的时刻花费在查询外设状况的操作上,然后大大提高了CPU的履行功率。
ARM体系 包含两类间断:一类是IRQ间断,另一类是FIQ间断。IRQ是一般间断,FIQ是快速间断,在进行大批量的仿制、数据传输等作业时,常运用FIQ间断。FIQ的优先级高于IRQ。
在ARM体系中,支撑7类反常,包含:复位、未界说指令、软间断、预取间断、数据间断、IRQ和FIQ,每种反常对应于不同的处理器形式。一旦发生反常,首要要进行形式切换,然后程序将转到该反常对应的固定存储地址履行。这个固定的地址称为反常向量。反常向量中保存的一般为反常处理程序的地址。ARM的反常向量如下:
反常 形式 正常地址 高向量地址
复位办理 0x00000000 0xFFFF0000
未界说指令 未界说0x00000004 0xFFFF 0004
软间断 办理 0x00000008 0xFFFF 0008
预取指间断 间断 0x0000000C 0xFFFF 000C
数据间断 间断 0x00000010 0xFFFF0010
IRQ IRQ 0x000000180xFFFF0018
FIQ FIQ 0x0000001C 0xFFFF 001C
由此可见,IRQ间断和FIQ间断都归于ARM的反常形式。在ARM体系中,一旦有间断发生,不管是外部间断,仍是内部间断,正在履行的程序都会停下来。接下来一般会依照如下进程处理间断:
(1)保存现场。保存当时的PC值到R14,保存当时的程序运转状况到SPSR。
(2)形式切换。依据发生的间断类型,进入IRQ形式或FIQ形式。
(3)获取间断源。以反常向量表保存在低地址处为例,若是IRQ间断,则PC指针跳动0x18处;若是FIQ间断,则跳到0x1C处。IRQ和FIQ的反常向量地址处一般保存的是间断服务子程序的地址,所以接下来PC指针跳入间断服务子程序处理间断。
(4)间断处理。
(5)间断回来,康复现场。当完结间断服务子程序后,将SPSR中保存的程序运转状况康复到CPSR中,R14中保存的被间断程序的地址康复到PC中,持续履行被间断的程序。
2.S3C2410A的间断操控器
ARM920T CPU的间断可分为FIQ和IRQ。为了使CPU能够呼应间断,有必要首要对程序状况寄存器(PSR)中的F位和I位进行正确设置。假如PSR的F位为1,则CPU不会呼应来自间断操控器的FIQ间断;假如PSR的I位为1,则CPU不会呼应来自间断操控器的IRQ间断。因而,为了使间断操控器能够接纳间断恳求,有必要在发动代码中将PSR中的F位和I位设置为0,一起还需求将间断屏蔽寄存器(INTMSK)中的相应位设置为0。
间断屏蔽寄存器用于指示间断是否制止。设置为1表明相应间断制止,为0则发生间断时正常履行间断服务。假如发生间断时相应的屏蔽位正好为1,则间断挂起寄存器中的相应间断源挂起位将置1。
S3C2410A有2个间断挂起寄存器:间断源挂起寄存器(SPCPND)和间断挂起寄存器(INTPND)。这两个挂起寄存器用于指示某个间断恳求是否处于挂起状况。当多个间断源恳求间断服务时,SRCPND寄存器中的相应方位1,裁定进程完毕后INTPND寄存器中只要1位被主动置1。
S3C2410A中的间断操控器能够接纳来自56个间断源的恳求。见芯片手册,因为引脚有限,因而选用了同享间断技能。由芯片手册可知S3C2410A共有32个间断恳求信号。间断恳求的优先级逻辑是由7个裁定器组成的,其间包含6个一级裁定器和1个二级裁定器。每个裁定器是否使能由寄存器PRIORITY[6:0]决议。每个裁定器能够处理4~6个间断源,从中选出优先级最高的。优先级次序由寄存器PRIORITY[20:7]的相应位决议。
要想运用S3C2410A的间断操控器,有必要对以下列出的寄存器进行正确装备。以下寄存器中的每一位意义参看芯片手册。
寄存器地址 描绘 复位值
SRCPND0x4A000000 间断源挂起寄存器,当间断发生后,相应方位1 0x0
INTMOD0x4A000004 间断形式寄存器0=IRQ形式,1=FIQ形式 0x0
INTMSK0x4A00 0008 间断屏蔽寄存器 0=间断答应,1=间断蔽0xFFFFFFF
PRIORITY0x4A00000C 间断优先级操控寄存器,设置间断优先级 0x7F
INTPND0x4A000010 间断挂起寄存器,仅仅间断恳求的状况。 0x0
0=该间断没有恳求 1=该间断源宣布间断恳求
INTOFFSET0x4A000014 间断偏移寄存器,仅仅IRQ间断源 0x0
SUBSRCPND0x4A000018子间断源挂起寄存器,指示间断恳求的状况0x0
0=该间断没有恳求 1=该间断源宣布间断恳求
INTSUBMSK0x4A00 001C界说哪个间断源屏蔽 0=间断服务答应,1=间断服务屏 0x7FF
一切来自间断源的间断恳求首要被挂号到间断源挂起寄存器中。在间断形式寄存器,间断恳求分红两类:FIQ和IRQ。多个IRQ间断的裁定进程在优先级寄存器进行。
间断源挂起寄存器能够看作各种间断有无恳求的状况标志寄存器。相应方位1,阐明存在该间断恳求;相应位为0,阐明该间断恳求发生。
间断形式寄存器首要用于装备该间断是IRQ型间断,仍是FIQ型间断。
3.间断编程实例
介绍一个经过守时器1间断操控CPU板上的LED1和LED2完结轮番闪耀的实例,需求完结的首要作业如下:
(1)对守时器1初始化,并设定守时器的间断时刻为1s,据代码拜见Timer1_init()函数。
void Timer1_init(void){
rGPCON=rGPGCON&0xfff0ffff|0x00050000; //装备GPG口为输出口
rGPGDAT=rGPGDAT|0x300;
rTCFG0=255;
rTCFG1=0
rTCNTB1=48828; //在pclk=50MHz下,1s的记数值rTCNTB1=50000000/4/256=48828
rTCMPB1=0x00;
rTCON=(1
rTCON=(1
}
(2)为了使CPU呼应间断,在间断服务子程序履行之前,有必要翻开ARM920T的CPSR中的I位,以及相应的间断屏蔽寄存器中的位。翻开相应的间断屏蔽寄存器的位,是在Timer1INT_Init()函数中完结,详细代码如下。
void Timer1INT_Init(void){
//守时器接口使能
if((rINTPND&BIT_TIMER1)){
rSRCPND|=BIT_TIMER1;
}
pISR_TIMER1=(int)Timer1_ISR;
//写入守时器1间断服务子程序的进口地址
rINTMSK&=~(BIT_TIMER1);
//开间断
}
(3)等候守时器间断,经过一个死循环如“while(1);”完结等候进程。
(4)依据设置的守时时刻,发生守时器间断。间断发生后,首要进行现场维护,然后转入间断的进口代码处履行。该部分代码一般运用汇编语言编写。在履行间断服务程序之前,要保证HandleIRQ地址处保存间断分发程序IsrIRQ的进口地址,代码如下:
ldrr0,=HandleIRQ
ldrr1,=IsrIRQ
strr1,[r0]
接下来将履行IsrIRQ间断分发程序,详细代码如下。
IsrIRQ
subsp,sp,#4 ;为保存PC预留仓库空间
stmfdsp!,{r8-r9}
ldrr9,=INTOFFSET
ldrr9,[r9] ;加载INTOFFSET寄存器值到r9
ldrr8,=HandleEINT0;加载间断向量表的基地址到r8
addr8,r8,r9,lsl#2;取得间断向量
ldrr8,[r8] ;加载间断服务程序的进口地址到r8
strr8,[sp,#8] ;保存sp,将其作为新的pc值
ldmfd sp!,{r8-r9,pc};跳转到新的pc处履行,即跳转到间断服务子程序履行
(5)履行间断服务子程序,该子程序完结将LED1和LED2灯平息或点亮。从现象中看到LED1和LED2灯闪耀一次,就阐明守时器发生了一次间断。详细完结见函数Timer1_ISR().
int flag;
void_ _irq Timer1_ISR(void){
if(flag==0){
rGPGDAT=rGPGDAT&0xeff|0x200;
flag=1;
}else{
rGPGDAT=rGPGDAT&0xdff|0x100;
flag=0;
}
rSRCPND|=BIT_TIMER1;
rINTPND|=BIT_TIMER1;
}
(6)从间断中回来,康复现场,跳转到被间断的主程序持续履行,等候下一次间断的到来。