Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47900
  • 博文数量: 18
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 209
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-11 19:33
文章分类

全部博文(18)

文章存档

2011年(1)

2009年(17)

我的朋友

分类: 嵌入式

2009-09-22 20:58:19

经过两天的“断网”,很高兴小孟终于又和大家见面了!今天在网上有一位朋友问我,为什么我的中断处理程序总是不能够执行?

由于当时我这面出了一点问题需要处理,我就没有来得及和他解释,回来之后想了想就决定写了这篇叫做“在ARM处理器中中断的简单使用”这篇文章。我希望对这位朋友有所帮助,同时也希望所有看到这篇文章的朋友都能够有所收获

 

为了让大家更好的理解中断的执行,在这我首先给大家介绍几个概念:

1》  什么叫中断响应

当外部中断源条件满足我们设定的条件之后,中断源会向CPU发出中断请求,这中间需要经过中断控制器,当满足条件时中断控制器才会真正的向CPU发出中断请求信号,CPU在条件满足(如处理器当前允许中断,处理完当前正在执行的指令之后等),CPU就会中断当前正在执行的程序,对中断请求做出相应,执行一系列操作之后(压栈,查表等),跳转到我们定义的中断服务子程序处开始执行。这一个过程就叫做中断响应。

2》  什么叫中断服务子程序

在介绍中断响应时,涉及到了一个概念-----中断服务子程序,顾名思义就是为我们的中断进行服务的,一般也就是我们要使用中断的目的。为了不影响整个系统的执行,一般中断服务子程序需要完成以下操作:通过一系列的压栈指令等完成“现场保护”--à设备服务程序(这部分才是真正的服务程序)--à恢复现场--à中断返回。一般在中断服务子程序中都要完成这些操作。

在上面我们又遇到了几个概念:

1、  现场保护:这部分主要的操作就是通过一系列的压栈指令,将一些寄存器进行压栈保存,以方便在中断处理子程序中使用这些寄存器,而在程序结束后又可以恢复原程序(主程序)中这些寄存器的值,以保持系统可以继续运行。

2、  恢复现场:完成与现场保护相反的操作,将保存在堆栈中的值,通过一系列的岀栈指令返回到对应寄存器中,恢复原程序(主程序)中断前的状态!

3、  设备服务程序:这部分使我们真正要做的,其实我们使用中断就是为了完成这部分功能!

有一点必须要说明,如果中断服务子程序需要执行很长时间的话,将长时间中断主程序的运行,这不是个好的主意,这将导致系统性能的下降,所以中断处理程序必须短小精悍!所以在linux系统中引入了新的中断机制,将一个中断分为两部分来执行----顶半部(top half )和底半部(bottom half)。关于这种机制我们以后在讲解linux驱动的时候会介绍到!今天就不涉及太多的内容了,否者我今天不睡觉也将不完了!O(_)O~

 

 

前面我们介绍了一些有关中断的一些基础概念,其中提到了,当外部条件满足后触发中断,经中断控制器后才可以到达CPU,最终调用中断处理子程序。可以看到,中断控制器在整个中断的处理中占据着重要的角色!下面我们就来看看中断控制器的有关知识。由于手头上没有arm7的芯片手册,在这我就以三星公司生产的S3C2410x为例来讲解!

 

通过阅读手册我们可以看到,S3C2410x的中断控制器主要包含6类寄存器,分别是中断源状态寄存器(SRCPND)、中断模式寄存器(INTMOD)、中断屏蔽寄存器(INTMSK)、中断优先级(PRIORITY)、中断状态寄存器(INTPND)和中断偏移寄存器(INTOFFSET)

下面我们按顺序来依次看一下这几个寄存器,只有了解了他们我们才可以来操作中断。

1)、中断源状态寄存器SCRPND

这是个32位寄存器,其每一位对应一个中断源。如果相应中断源产生了中断请求则该寄存器相应自动位置为1。注意这个过程是由中断请求自动置位的,不受中断屏蔽寄存器和中断优先级寄存器中内容的影响。该位的清除必须有手动完成,在中断服务子程序中必须手动的对该位清零,清除方法是向该位写入1,即可将该位清零。

 

 

 

这个图是在S3C2410X的手册中截取的,如果看不清大家可以参考手册。在这需要说明大家既然决定从事这一行了,芯片手册是必须要有的!更重要的是大家要提高自己的英文读能力,懂多少不重要,重要的是你可以在相同的时间内获取比别人更多的信息,并将它们掌握,这样迟早你会胜过对方!

 

再看下一个寄存器

2)、中断模式寄存器INTMOD

顾名思义,这个寄存器使用来设置中断的工作方式的,指出是IRQ还是FIQ模式。

 

如果对应位是0,那么就是IRQ中断模式,1就是FIQ模式。

3)、中断屏蔽寄存器INTMSK

0------------中断服务有效

1----------该位对应中断屏蔽

4)、优先级寄存器PRIORITY

5)、中断状态寄存器INTPND


 

 

同样该寄存器每一位对应一个中断。如果相应中断源产生了中断请求并且INTMSK中对应位没有设置为1(即没有屏蔽该位),同时如果具有最高优先级,则在INTPND寄存器对应位置1.注意该寄存器同时只能有一位置为1,在该位置1的同时,控制器向CPU产生中断。CPU进入ISR后,可以通过读该寄存器来决定现在应该处理哪一个中断。

当进入中断服务程序之后,不要忘了对相应位清零。这个过程和SRCPND寄存器的操作类似,都是通过相对应位写入1来清零的。如果忘了将该位清零,那么你的程序可能不会响应其他中断了。

6)、中断偏移寄存器—INTOFFSET

 

 

该寄存器的值表明在IRQ模式下哪一个中断请求位于INTPND寄存器中,也就是哪一个中断正在被执行。该寄存器的值将在SRCPNDINTPND寄存器的值被清除后,自动清除。

 

 好了,第一部分先讲到这,请留意关注第二部分

 http://blog.chinaunix.net/u3/104009/showart.php?id=2057856

 

 


阅读(905) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~