ARM中断机制
来源:互联网 发布:善领端口是那个文件 编辑:程序博客网 时间:2024/06/05 00:18
ARM中断机制
当事件发生时,通过一种机制告诉CPU现在发生什么事件,CPU停下现在所做的工作进行处理。中断处理流程:中断控制器汇集各类外设发出的中断信号,经过一段处理,选出一个信号,然后通知CPU;CPU保存当前运行环境,然后调用中断服务程序(ISR)处理中断;在ISR中通过读取相关寄存器的外设判断中断类型,并进行相应的处理。清除中断:通过读写相关中断寄存器和外设相关寄存器实现;恢复被中断程序的执行环境,继续执行被中断程序。
S3c2440支持60个中断源,当外设产生中断后,中断控制器进行经过相应的一些处理,选出一个最适合的中断信号告诉CPU。
非子中断源走下面,子中断源走上面,下面第一个寄存器SUBSRCPNO寄存器,SUBSRCPNO用来标识子中断是否发生,s3c2440有15个子中断,SUBSRCPNO每一位代表一个子中断,当这些子中断发生时,相应的位置1 。第二个寄存器INTSUBMASK用来屏蔽SUBSRCPN产生的中断信号,中断申请立刻拒绝,INTSUBMASK中某位置1时相应的子中断被屏蔽,设为0时被允许。寄存器SRCPND,每位用来标明中断是否发生,每个中断源都有相应的位与之匹配,INTMASK寄存器,用来屏蔽SRCPND产生的一类中断,某位被置1相应的中断被屏蔽,只能屏蔽IRQ中断。mode寄存器,某位被设置为1所对应的中断源被设置为FIQ模式,此中断发生时会进入快中断模式,IRQ模式下,中断处理程序需要自己保存r8到r12寄存器,退出中断时需要自己恢复寄存器值,而FIR这几个寄存器都有back寄存器(fir_r8......),模式切换时CPU自动保存这些值到back寄存器,退出时自动恢复。FRQ比IRQ快,有较高优先级。INTMOD设置中断源是IRQ还是FRQ。经过模式设置后,如果是FRQ就直接处理,IRQ经过优先级排序。
优先级选择:选择出最高级中断处理,首先把32个中断划分成6个组,有6个arbiter(仲裁器)仲裁谁的优先级最高,比如arbiter0, 外部中断0,1,2,3,在同一个仲裁器内优先级,由ARB_SEL决定
还有ARM_MODE,如果为0,ARB_SEL不会自动改变,如果设置为1,ARB_SEL就会自动改变
REQ0和REQ5不会改变,REQ1,2,3,4交换,当REQ1正在服务时,ARB_SEL自动切换到01b,REQ1放在最后.........................
经过层层删选最后选择出要执行的中断在INTPND寄存器体现,经过中断优先级仲裁器选出优先级高的中断后,这个中断在INTPND相应的寄存器置1,随后CPU进入中断模式处理,同一时间内此寄存器只有一位置1 。
按键控制程序设计
Mini2440使用6个按键分别对应的外部中断,当按键按下时形成低电平触发中断,按键还对应了GPIO资源,GPIO作为输入,通过按键获取到相应的值。
下列使用轮询方式(CPU不断查询状态)设计,按一次点亮一个LED。int Wait_key(void);void key_init(void);void Led1_init(void);void Led1_run (void);void main (void){LED1_init();while(1){if(Wait_key())Led1_run();//点亮LED}}void key_init (){rGPGCON &= ~(3<<0);//设置为输入模式}void Led1_init (){rGBCON &= ~(3<<10);rGBCON |= (1<<10);//设置GPB5管脚为输出模式}void Led1_run (){rGPBDAT &=~ (1<<5);//灯亮delay(1000);rGPBDAT |=~ (1<<5);//灯灭delay(1000);}int Wait_key (void){if(!(rGPGDAT & 0x01)) //如果rGPGDAT 最后一位为0,GPGDAT & 0x01为0,按键按下,反之为1delay(200);if(!(rGPGDAT & 0x01)){while(!(rGPGDAT & 0x01))//按下后后等待按键松开return 1;//有按键按下}elsereturn 0; //无按键按下}
按键控制程序设计下面以中断方式设计
void key_init(void);static void __irq key_handler(void);void Led1_init(void);void Led1_run(void);void delay(int times){ int i,j; for(i=0;i<times;i++) for(j=0;j<400;j++);}void Main(void){ Led1_init(); MMU_Init(); key_init(); while(1);}void key_init(void){ rGPGCON &= ~(0x3<<0); /*set eint8 as interrupt*/ rGPGCON |= (0x2<<0); rEXTINT1 &= ~(0xf<<0); /*set eint8 with low level*/ rEINTPEND |= (1<<8); rEINTMASK &= ~(1<<8); /*设置ISR*/ pISR_EINT8_23=(U32)key_handler; EnableIrq(BIT_EINT8_23);} static void __irq key_handler(void){/*判断是否是按键K1产生的中断*/ if(rINTPND==BIT_EINT8_23) {ClearPending(BIT_EINT8_23);if(rEINTPEND&(1<<8)) {rEINTPEND |= 1<< 8;Led1_run();}}}void Led1_init(void){ rGBCON &= ~(3<<10);rGBCON |= (1<<10);//设置GPB5管脚为输出模式}/*************************************************Function name: Led1_run()Parameter : voidDescription : 运行LedReturn : voidArgument : voidAutor & date : Daniel**************************************************/void Led1_run(void){ rGPBDAT &=~ (1<<5);//灯亮delay(1000);rGPBDAT |=~ (1<<5);//灯灭delay(1000);}
- ARM中断机制
- ARM中断机制
- ARM中断机制
- ARM的异常中断机制
- ARM的异常中断机制
- ARM中断机制小述
- ARM的异常中断机制 .
- ARM Linux中断机制分析
- ARM的异常中断机制
- ARM Linux中断机制分析
- ARM Linux中断机制之中断处理
- ARM Linux中断机制之中断处理
- arm linux中断机制学习第一篇
- ARM Linux中断机制之中断的初始化
- ARM Linux中断机制之中断的初始化
- ARM中断
- ARM中断
- ARM 中断
- 相同字符数目
- C# ppt转PDF
- GraphX中Pregel单源点最短路径
- 在青云上创建虚拟机并远程登录
- 简介DefaultView
- ARM中断机制
- sockaddr与sockaddr_in结构体简介
- ubuntu下Tomcat7安装
- PCA的简单理解
- Gallery
- 利用Bundle实现Activity之间的数据传递。
- Derson Number
- Java内存空间划分初识(适合初学者)
- Android数据存储之一SharedPreferences共享参数类