Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504216
  • 博文数量: 76
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1534
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-10 16:28
文章分类
文章存档

2010年(1)

2009年(3)

2008年(72)

我的朋友

分类: LINUX

2008-06-10 10:02:07

   在驱动中经常会以中断的方式来处理数据,以前总是搞的不太清楚,今天在这里和S3C2410的中断处理来做个了结。ARM的CPU中一般都带有一个中断控制器,S3C2410也不例外。S3C2410中断控制器可以支持56个设备,其中包含内部设备和外部设备。内部设备有UART0,LCD,USB等;外部设备是EINT0/EINT1/EINT2/EINT3,这几个外部中断是各自的占有一条外部中断线;EINT4~7,4~7号外部中断共用一条数据线;EINT8~EINT23共用一条数据先,外部中断是通过GPIO复选功能来实现的。
   在中断处理中重要的几个寄存器:SRCPND(SOURCE PENDING REGISTER),INTPND(INTERRUPT PENDING REGISTER),INTMSK(INTERRUPT MASK REGISTER)。
   SRCPND是中断源引脚寄存器,在一个中断异常处理流程中,中断信号传进中断异常处理模块后首先遇到的就是SRCPND,这个寄存器的作用是标志出哪个中断请求被触发。SRCPND的有效位是32位。
   INTPND寄存器和SRCPND是相同的位设置,但是他们在中断异常处理中却扮演着不同的角色,SRCPND是中断处理经过的第一个寄存器,而INTPND是中断处理经历的最后一个寄存器。它的每一位对应着一个中断请求,若该位为1则中断请求被触发。它和SRCPND的主要区别是:在同一时刻可以有多个中断被触发,因此在SRCPND寄存器中可以同时有多个bit位被置1;然而INTPND则不同,它在同一个时刻只能有1个位被置1。做个总结:SRCPND说明了有什么中断被触发了,INTPND说明了CPU即将或已经在对某一个中断进行处理。
   特别注意,每当一个中断处理结束后,我们必须手动的把SRCPND/SUBSRCPND,INTPND三个寄存器中与该中断相应的位由1变成0。对于INTPND的操作很特别,它的特别之处在于将该寄存器某一个位又1变成0时,不是往该位写0,而是往该位写1。例如SRCPND=0x00000003, INTPND=0x00000001,该值说明当前0号中断和1号中断被触发,但是当前正在被处理的是0号中断,处理完毕后就应该将0号中断的位置清理掉,这样设置INTPND和SRCPND寄存器:
   SRCPND = 0x00000002      //位0被置为0
   INTPND = 0x00000001      //位0被置为0(方法是往该位写入1)
   INTMSK此处理器为中断屏蔽寄存器,有效长度为32bit,它们的作用是决定该位相应的中断请求是否被处理。若某位被设置为1,则该位相对应的中断产生后将被忽略(CPU不处理该中断请求),设置为0则对其进行处理。在S3C2410中初始化的数值是0xFFFFFFFF就是说在初始状态所有的中断是被屏蔽掉的。如果我们要打开一个中断服务可以这样:writel(readl(INTMSK)&(~0x01), INTMSK), //使能EINT0。以上讲的都是对2410主中断源的分析。
阅读(2749) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~