ARM中断处理及状态机嵌套实现
所有的中断请求一旦产生则中断反应会经过三个步骤
a.输入阶段这个逻辑可以根据中断源被实现,需要0-2个时钟周期
b.EIC自身处理 2个时钟周期
c.ARM7的逻辑处理
2.EIC Enhanced Interrupt Controller增强型中断控制器
EIC硬件处理多路中断,中断优先运算和矢能。
a.32路可屏蔽的中断,映射到ARM 的CPU中断请求总线
b.每路16级可编程优先级映射IRQ
c.硬件支持最大16个中断嵌套
d.2路可屏蔽的中断通过FIQ中断请求总线
e.在0x18处的寄存器装载的是最高优先及中断用户自定义的中断处理地址
f.16个XTI块外部中断
3.中断处理过程
1.检查相关中断的请求屏蔽位
2.比较所有中断请求的优先级,IRQ当前中断是否优先级高于当前存储的中断。
3.自动装载EIC_SIRn[31:16]位用户自定义地址进入EIC_IVR[15:0]中
4.手动装载用户中断处理高16位地址进入EIC_IVR[31:16]
5.当新产生一个中断则保存先前的中断优先级进入优先栈中。
6.当新的中断被接受则用新的优先级更新当前中断优先级寄存器
EIC_ICR 中断控制寄存器
31-2保留
1. FIQ_EN:RW是FIQ允许的标志位置1开启置0关闭
0.IRQ_EN:RW是IRQ允许的标志位置1开启置0关闭
EIC_CICR 中断频道控制寄存器
31-5保留
4-0.CIC[4:0]:R是当前中断的序号,是第几号中断由中断请求发生时硬件写入
EIC_CIPR当前中断优先级寄存器
31-4保留
3-0 CIP[3:0]:rw是当前中断的优先级,在IRQ总线上会自动探测进入的中断请求优先级
和当前的优先级的高低。
EIC_IVR 中断矢量寄存器
IVR[31-16]:IRQ用户写入的在程序初始化时,是中断服务的高16位地址
IVR[15-0]:I在中断请求接受后,从EIC_SIRn[31-16]的自定义服务程序地址拷贝过来
EIC_FIR
3-2FIP[3:2] 是FIQ的中断频道
1-0FIE[1:0] 是FIQ的中断允许标志位
EIC_IER0中断启动寄存器
32为对应配置32路中断的运行位
EIC_IEP0中断启动寄存器
32对应配置32路中断的中断挂靠位根据IER0中设置同步。
note:只读/写零的寄存器,在退出中断服务后ISR,软件要清除相应的挂靠位,
才能保证下次不继续进入这个中断,这个清除操作带来一个中断结束中断
并且保证有已经嵌套的中断正常弹出,顺利执行新的中断。
这个中断位要注意不能随便清除如果清除了不是期望的中断位的话,导致
嵌套堆栈永不恢复。
EIC_SIRn源中断寄存器
SIV[31-16]是自定义服务地址偏移
15-4保留
3-0优先级
FSM: 有限状态机制
FSM分为两种状态READY和WAIT,这两种状态根据ARM7TDMI的nIRQ总线探测出来
如果全局中断允许位IRQ_EN标志被清除,nIRQ无条件的的检测为高.在reset的
时候FSM=READY也就是nIRQ=HIGH,当优先解码确定了一个新的中断,FSM=WAIT
并且nIRQ=LOW。如果要转到就绪状态必须强制读EIC_IVR寄存器内容即处理中
断服务或者rest EIC单元。读EIC_IVR寄存器改变状态机状态同时释放EIC的
nIRQ总线。
STACK:堆栈
ARM支持15个事件嵌套,嵌套的事件信息均在需要的时候被压入弹出堆栈。
事件的信息包括 中断频道EIC_CICR interrupt channel,中断优先级EIC_CIPR
interrupt priority.
当FSM=WAIT即状态机在等待状态也就是解码出一个最高优先中断源时,直接来读取
EIC_IVR寄存器会产生内部标志,需要把EIC_CICR EIC_CIPR入栈,当做完入栈工作
后才在第二时钟周期读取EIC_IVR进行中断服务,读完后内部标志清除即需要把当前
的EIC_CICR EIC_CIPR给出栈。 然后更新当前中断源和当前中断优先寄存器。
当FSM=READY的时候EIC_IVR的访问时候是不产生内部标志来进行嵌套的。
在嵌套时当前中断服务完成后必须清除相应标志位(具体看EIC_IEP0介绍)
然后处理上一个被压栈的中断。
ARM中断处理状态机嵌 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)