Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88580
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 379
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-13 06:58
文章分类
文章存档

2013年(21)

我的朋友

分类: 嵌入式

2013-10-30 09:21:44

有意转载,请标明来源:http://blog.csdn.net/shiyi_2012/article/details/7467956

其实对于ARM9中断和51差不多啦,总的就是中断前期准备做好,然后中断满足,中断做后续工作就OK啦。

第一个问题就是ARM9中断实质。

首先要好好理解这个表,就是相应的中断产生之后,处理器就会使得PC指针自动跳转到该对应地址上。所以,对于对应中断服务程序实现的方法就有两个。一个在该地址上用跳转指令跳到服务程序指定位置,第二个方法就是把该中断服务程序放到该对应地址开始处。这里注意一下就是IRQ和FIQ中断的入口地址为0x18和0x1c。还有注意一下,由于上面8种异常都应某种CPU模式,在进入该异常中断前要设置好模式。并且不同模式都拥有自己的栈等,这些在三星提供的初始化文件,已经帮我们做好了。我们要做的就是理解该文件实现的功能。


第二个问题:有哪些寄存器

在说寄存器之前,要知道2440有60个中断源,分为一级中断源和二级中断源。一级中断源占了23个。就像:


EIN4_7属于一级中断源,但是该中断源包含EIN4\EIN5\EIN6\EIN7四个子中断源。

1.SRCPND源挂起寄存器。

该寄存器在中断源发出请求时候,处理器就会自动置位该寄存器的相应的位为1.

注意:根据三星文档知道,该位不受寄存器影响,这个寄存器是屏蔽寄存器。在则在执行服务程序时候,该位不许进行清除,否则会导致连续中断。清除方法是往该位写入1。


2.INTMOD中断模式寄存器

该寄存器决定中断源为FIQ中断还是IRQ中断。

注意:根据三星文档,INTPND寄存器和INTOFFSET寄存器只对IRQ模式有效


3.INTMSK中断屏蔽寄存器

决定是否屏蔽某中断源

注意:没有


4.PRIORITY优先级寄存器

决定中断源优先级。


5.INTPND中断服务程序标志位

根据文档说,在中断源没被屏蔽,并且在等待中断服务,优先级也是最最高的置1.啥意思,就是该寄存器对应位置1,表示CPU已经响应该对应的中断请求。

注意:和SRCPND一样,在中断服务程序时候要清除该对应位。


6.INTOFFSET寄存器

该寄存器和INTPND配合使用的。标明INTPND寄存器里对应IRQ中断反映在INTOFFSET寄存器的值

注意:也需要清除位


7.SUBSRCPND寄存器

该寄存器与.SRCPND寄存器配合使用,在子中断源发出请求时候,处理器就会自动置位该寄存器的相应的位为1.


8.INTSUBMSK寄存器

该寄存器和INTMSK寄存器一样,只不过是相对于子中断而言而已。


八个寄存器就这样,具体参看三星2440官方资料。。。。


第三个问题:操作步骤

1.设置好中断模式以及相关的栈,可看三星提供的初始化文件。

2.在异常向量表设置好相应的跳转指令。那么当产生中断的时候,PC指针就会跳到该向量表处,那么就会执行跳转指令到相应的服务程序入口。

3.在设置异常模式下CPU模式和相关的栈之后(三星的初始化文件),就可以用跳转指令,跳到我们的C语言部分。

4.在C语言部分,就可以写我们的程序啦:

这关乎到几种类型,外部中断,普通中断,又分一级中和二级中断,又分FIQ中断和RIQ中断。所以说起来有点麻烦。如果写出来相当麻烦,这是来自网站的一张图,不过我进行了更全面的改进(有错误还望改正):


其中深黑色的就是编程要用的寄存器,而浅黑色的寄存器时CPU根据我们配置的寄存器产生的标志位寄存器。


5.最后就服务程序啦。主要工作,清除标志位。这个要注意顺序:SUBSRCPND------SRCPND-------INTPND,不按顺序,可能会产生两次中中断,或则某标志位清除不了。


下一篇就是中断代码。










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