S3C2440中断体系结构
断IRQ,可能同时有几个中断被触发,未被INTMSK寄存器屏蔽的中断经过比较后,选出优先级最高的中断,此中断在INTPND寄存器中的 相应位被置1,然后CPU进入中断模式进行处理。中断服务程序通过读取INTPND或者INTOFFSET来确定中断源
三、中断控制寄存器
1)SUBSRCPND寄存器
它用来表示INT_RXD0、INT_TXD0等中断是否发生,每位对应一个中断,当这些中断发生并且没有被INTSUBMSK寄存器屏蔽,则它们中的若干位将汇集出现在SRCPND寄存器的某一位上。要清除中断,往此寄存器中某位写1
2)INTSUBMSK寄存器
它用来屏蔽SUBSRCPND寄存器所标识的中断,INTSUBMSK寄存器中某位设置1时,对应的中断被屏蔽
3)SRCPND寄存器
它每一位被用来表示一个或一类中断是否发生,要清除某一位,往此位写1,具体参考数据手册
4)INTMSK寄存器
用来屏蔽SRCPND寄存器所标识的中断。INTMSK寄存器中某位被设为1时,对应的中断被屏蔽,它只能屏蔽IRQ中断,不能屏蔽FIQ
5)INTMOD寄存器
它某位被设为1时,对应的中断被设为FIQ,同一时间,INTMOD只能有一位被设为1
6)PRIORITY寄存器
当有多个IRQ同时发生时,中断控制器选出最高优先级的中断,首先处理它。中断优先级通过7个仲裁器来完成,结构图如下所示:
每个仲裁器基于一个位仲裁器模式控制(ARB_MODE)和选择控制信号(ARB_SEL)的两位来处理 6个中断请求。
如果ARB_SEL位是 00b,优先级是REQ0,REQ1,REQ2,REQ3,REQ4,和REQ5.
如果ARB_SEL位是 01b,优先级是REQ0,REQ2,REQ3,REQ4,REQ1,和REQ5.
如果ARB_SEL位是 10b,优先级是REQ0,REQ3,REQ4,REQ1,REQ2,和REQ5.
如果ARB_SEL位是 11b,优先级是REQ0,REQ4,REQ1,REQ2,REQ3,和REQ5.
注 意仲裁器的 REQ0 总是有最高优先级,REQ5 总是有最低优先级。此外通过改变ARB_SEL 位,我们可以翻转 REQ1 到 REQ4 的优先级。如果ARB_MODE位置0,ARB_SEL位不会自动改变,使得仲裁器在一个固定优先级的模式下操作(注意在此模式下,我们通过手工改变 ARB_SEL 位来配置优先级)。另外,如果 ARB_MODE 位是 1,ARB_SEL 位以翻转的方式改变。例如如果 REQ1 被服务,则ARB_SEL位自动的变为01b,把REQ1放到最低的优先级。ARB_SEL变化的详细规则如下:
如果REQ0 或REQ5 被服务,ARB_SEL位完全不会变化。
如果REQ1 被服务,ARB_SEL位变为 01b。
如果REQ2 被服务,ARB_SEL位变为 10b。
如果REQ3 被服务,ARB_SEL位变为 11b。
如果REQ4 被服务,ARB_SEL位变为 00b。
7)INTPND寄存器
经过中断优先级选出优先级最高的中断后,这个中断在INTPND寄存器中的相应位被置1,随后CPU进入中断模式处理它
同一时间,此寄存器只有一位被置1,在ISR中,可以根据这个位确定是哪个中断,清除中断时,往此位写入1
8)INTOFFSET寄存器
用来表示INTPND寄存器中哪位被置1了,即INTPND寄存器中位[x]为1时,INTOFFSET寄存器的值为x(x为0-31)
清除SRCPND、INTPND寄存器时,INTOFFSET寄存器被自动清除
四、中断控制器操作实例:外部中断
开发板上,K1-K4四个按键所接的CPU引脚可以设为外部中断,本程序的功能是,当按下某个按键时,CPU调用中断服务程序点亮对应的LED
@******************************************************************************
@ File:head.S
@ 功能:初始化,设置中断模式、系统模式的栈,设置好中断处理函数
@******************************************************************************
.extern main
.text
.global _start
_start:
@******************************************************************************
@ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用
@******************************************************************************
b Reset
@ 0x04: 未定义指令中止模式的向量地址
HandleUndef:
b HandleUndef
@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式
HandleSWI:
b HandleSWI
@ 0x0c: 指令预取终止导致的异常的向量地址
HandlePrefetchAbort:
b HandlePrefetchAbort
@ 0x10: 数据访问终止导致的异常的向量地址
HandleDataAbort:
b HandleDataAbort
@ 0x14: 保留
HandleNotUsed:
b HandleNotUsed
@ 0x18: 中断模式的向量地址
b HandleIRQ
@ 0x1c: 快中断模式的向量地址
HandleFIQ:
b HandleFIQ
Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
msr cpsr_c, #
S3C2440中断体系结 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)