中断控制
利用arm的外部中断时,需要在linux下设置中断控制寄存器吗?例如INTMOD SRCCON这些等。
每次发生中断后,是不是要对有些状态寄存器重新设置。没有操作系统时好象需要,但在操作系统下,在中断处理函数中,我没有设置任何和中断有关的寄存器了。好象也能中断。
------------------是不是中断寄存器都是由操作系统自动设置的呀
[ 本帖最后由 bsdhnit 于 2008-9-5 16:30 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
看看驱动程序,是不是完成了这个设置。
不熟悉ARM,不过一般中断控制器的处理主要是由操作系统统一处理的吧,具体的中断中主要是处理自己针对的外设相关的操作,一般不会处理中断控制器。
系统在引导的时候由loader来完成,中断控制器的初始化工作,建立起中断向量列表(如果采用中断向量的话),ARM体系结构下通常会有这样的代码:
handler
B P_abort ; Handler Programme abort
B D_abort ; Handler Data abort
B . ; handlerReserved
LDR PC, =HandlerIRQ
LDR PC, =HandlerFIQ
LDR PC, =HandlerEINT0 ; 0x20
LDR PC, =HandlerEINT1
LDR PC, =HandlerEINT2
LDR PC, =HandlerEINT3
LDR PC, =HandlerEINT4567
这就是你的中断向量列表,当中断发生后,运行相应的代码,将中断的中断号提交给linux(这项工作应该在loader中进行,或者你叫他BIOS也可以),linux利用这个中断号,检查先前谁通过request_irq申请过这个中断号,如果找到的话调用request_irq中指定的中断处理程序。
好了大体流程是这样的,现在就有一个方法的选择问题。通常的做法是当中断发生后,由BIOS或loader记录下中断号,然后将中断号发往linux并清除中断的pending、开中断,剩下的就是linux根据中断号做相应的调用,这样做可以实现中断的快速响应,如果在你的驱动开中断的话,系统的中断将会被关闭很长时间而得不到响应。
当然你也可以选择其他的操作方法,根本不用BIOS或loader,完全由linux来控制底层,只不过是可以移植性要受到影响~~
[ 本帖最后由 .kaka 于 2008-9-7 16:26 编辑 ]
LINUX下的中断是由OS处理的,中断发生,向OS发出信号,OS根据中断,进行相应的处理。