分类: 嵌入式
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,不按顺序,可能会产生两次中中断,或则某标志位清除不了。
下一篇就是中断代码。