S3C2410中断控制器详解:中断管理与优先级

需积分: 9 2 下载量 62 浏览量 更新于2024-09-12 收藏 1.83MB DOC 举报
"本章节主要介绍了S3C2410中断控制器的工作原理和功能,包括中断源、中断模式、中断请求寄存器、中断屏蔽寄存器以及中断优先级的详细信息。" 在嵌入式系统中,中断控制器扮演着关键角色,它管理来自不同设备的中断请求并确保处理器能够有序响应。S3C2410中断控制器能够处理56个中断源,这些源可能来自于内部外设如DMA控制器、UART、IIC等,或者是外部中断引脚EINTn。中断源的输入逻辑是或逻辑,意味着多个中断可以同时存在,但控制器会根据硬件优先级进行仲裁。 中断模式分为两种:FIQ(快速中断)和IRQ(普通中断)。ARM920T处理器在PSR(程序状态寄存器)的F和I位分别控制这两种中断的接受状态。如果F或I位被置1,则相应的中断类型将被禁止。中断控制器通过清零这些位来允许中断的发生。 中断请求由两个寄存器管理:源请求寄存器(SRCPND)和中断请求寄存器(INTPND)。SRCPND记录所有中断源的请求,而INTPND则表示经过仲裁后的有效中断。中断服务开始于INTPND的某位被置1且I或F位为0时。中断请求可以通过向SRCPND和INTPND相应位置写1来清除。 中断屏蔽寄存器(INTMSK)用于控制哪些中断被允许服务。如果INTMSK的某位为0,相应的中断可以正常响应。即使中断源请求了中断,若其对应的INTMSK位为1,中断请求也将被忽略。 中断控制器支持的56个中断源包括多种设备和事件,这些中断源被分为不同的优先级。32个中断请求的优先级由一个旋转仲裁机制决定,分为一级仲裁位和二级仲裁位。仲裁器根据ARB_MODE和ARB_SEL的设置来确定中断处理的优先级顺序。 中断控制器是系统中协调设备通信和处理器响应的关键组件,它的有效管理和配置对于系统的实时性和性能至关重要。理解中断控制器的工作方式有助于优化系统的中断处理策略,从而提高系统的响应速度和效率。

#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit P10=P1^0; uchar a=0;//T0中断次数 char c=0; //闪烁次数 uint b=0; //外部中断(S14问 uint z; //判断减一执行后是否开启加一按键 void delay(uint z); void display(); uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code wei[]={0x01,0x02}; uchar m[]={0,0}; void delay(uint z){ //延迟函数 uint j,k; for(j=0;j<z;j++) for(k=0;k<25;k++); } void display(){ //数码管显示函数 uchar i; m[0]=TL1%10; m[1]=TL1/10; for(i=0;i<2;i++){ P2=wei[i]; P0=table[m[i]]; delay(10); } } void tini(){ //定时/计数器初始化 TMOD=0x61; //T0方式1定时,T1方式计数 0110 0001 TL1=0x00; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=0; //T0停止计数 TR1=0; //T1停止计数 } void exini(){ //外部中断初始化 EA=1; //CPU开中断 EX0=1; //允许INT0中断 EX1=1; //允许INT1中断 ET0=1; //允许T0中断 ET1=1; //允许T1中断 PX0=1; IT0=1; //INT0中断下降沿触发 IT1=1; //INT1中断下降沿触发 } void shanshuo(){ //闪烁程序 for(c=TL1;c>0;c--){ P10=1; delay(500); display(); P10=0; delay(500); display(); } } void main (void) { exini(); tini(); while(1){ display(); } } void int3_0() interrupt 0{ //外部中断0服务程序 b=b+1; //中断次数加一 TR1=1; //启动计数器1 switch(b){ case 1:TR1=1;break; case 2:TR1=0;b=0;TR0=1;break; } } void int1_0() interrupt 2{ //外部中断1服务程序 if(TR1==1) z=0; else z=1; TR1=0; if(TL1>0){ TL1=TL1-1; //计数值减一 } else{ TL1=0; TR1=0; } if(z==0) TR1=1; else if(z==1) TR1=0; } void int1_3() interrupt 1{ //计时器T0中断服务程序 TH0=(65536-50000)/256; //定时50ms时间常数 TL0=(65536-50000)%256; a=a+1; //中断次数加一 if(a==100){ a=0; TR0=0; //停止计时 shanshuo(); P10=1; //LED熄灭 } } 对此代码进行完善处理

2023-05-24 上传