疑问:
1.为什么s3c2440的裸机中断程序里面的某些函数没有用到也要声明?不声明运行会出错.
2.为什么eint11需要EINTMASK使能中断它,而eint0, eint2不需要,是因为,[0-3]保留吗?(EINTMASK是外部中断屏蔽寄存器)
关于问题1:(一下声明中只用到0x18,中断模式,其他都没有用到)
-
@中断向量,0xxx即相应的入口地址.(注意地址即可,函数名称可以改)
-
-
@ 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
中断优先级:(需要设置模式控制,和选择控制信号)
注意区别EINTMASK(外部中断屏蔽寄存器)和INTMSK(中断屏蔽寄存器)
中断屏蔽寄存器(INTMSK)[部分截图]:(注意使能8-23是bit5,使能4-7是bit4)
清除中断:
1.EINTPEND(外部中断挂起寄存器)
写"1"清除!(bit0-3不需要专门清除,bit4-23则要)
例如:(清除11位,中断实验中eint11对应的是irq5[中断5])
2.源挂起(SRCPND)寄存器
SRCPND 寄存器由 32 位组成,其每一位都涉及一个中断源。如果中断源产生了中断则相应的位被设置为 1 并
且等待中断服务。因此此寄存器指示出是哪个中断源正在等待请求服务。注意 SRCPND 寄存器的每一位都是由中
断源自动置位,其不顾 INTMASK 寄存器中的屏蔽位。另外 SRCPND 寄存器不受中断控制器的优先级逻辑的影响。
在指定中断源的中断服务程序中,必须通过清除 SRCPND 寄存器的相应位来正确的获得来自相同源的中断请
求。如果从 ISR 中返回并且未清除相应位,则中断控制器的操作就好像其它中断请求已经从同一个源进入了。换句
话说,如果 SRCPND 寄存器的指定位被设置为 1,其通常被认作一个有效中断请求正在等待服务。
清除相应位的时间依赖于用户的需要。如果希望收到来自相同冤源的其它有效请求,则应该首先清除相应位,
并且接着使能中断。
可以通过写入一个数据到此寄存器来清除 SRCPND 寄存器的指定位。其只清除那些数据中被设置为 1 的相应
位置的 SRCPND 位。那些数据中被设置为 0 的相应位置的位保持不变.
(也是写"1"清除!)
3.清除INTPND寄存器.
就如 SRCPND 寄存器,必须在中断服务程序中清除了 SRCPND 寄存器后清除此寄存器。可以通过写入数据
到此寄存器中来清除 INTPND 寄存器的指定位。
只会清除数据中设置为 1 的相应 INTPND 寄存器位的位置
(也就是在对应位写"1"清除!)。
数据中设置为 0 的相应位的位置则保持不变
阅读(2634) | 评论(0) | 转发(0) |