免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2424 | 回复: 1
打印 上一主题 下一主题

linux 中断 [复制链接]

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-11 11:27 |只看该作者 |倒序浏览
30可用积分
tempname2在线上讨论之linux中断总结分享一帖引入的几个问题一直没人回答。感觉可以对中断加深理解。


一、介绍一下线程化中断
二、generic irq抽象出了对控制器的操作与以及对edge or level trigger的处理,那原来__do_IRQ里的哪些代码区别对待了edge-triggered和level-triggered。
三、8259在不能与CPU与交互的情况下是否能锁存住一次edge-triggered中断。
四、举出具体例子,从中断发出方的视度来看中断的整个流程。如果设备是level-triggered,它什么时候撤消中断信号?如果设备是edge-triggered,某一次边沿变化后,它会马上还原为之前的电平信号还是下一次再想中断时才变化?

Generic IRQ似乎就是抽象出了一种假想的中断控制器,假定它具有某些操作,然后真正硬件控制器驱动组合使用primitive operations来到达期待的效果。但是初学者不好理解假定的细节啊。比如ack方法有什么效果?level-triggered中断是不是先ack控制器,再ack设备?而edge-triggered中断只需要ack控制器?

另外为什么handle_edge_irq里有个循环而handle_level_irq里没有?irq_check_poll的有什么作用最终达成何种效果?handle_edge_irq注释里的一段话:

   This requires to reenable the interrupt inside
      of the loop which handles the interrupts which have arrived while
      the handler was running.



是什么意思?

希望大家讨论讨论,牛人也指点指点!

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
2 [报告]
发表于 2011-12-11 14:35 |只看该作者
本帖最后由 linuxfellow 于 2011-12-11 15:35 编辑

一、介绍一下线程化中断

不知道什么是线程化中断。
中断是指CPU终止当前运行程序转而处理系统中优先级较高的事件,事件处理完后,回来接着原来的程序运行。被中断程序的状态必须得到完好的保存,中断子程序结束后,原程序应该能继续正确运行。
中断按中断源来分可以分为:
软中断:中断由运行程序本身产生。如TRAP;程序自己执行一些指令来改变程序正常运行流程
硬中断:中断由硬件信号产生;如看门狗引起
中断按严重程度分:
不可屏蔽中断:属于优先级较高的事件;只要发生就不能被忽视,必须处理
可屏蔽中断:  可以通过软件配置屏蔽这类中断;即使发生系统也可不理

二、generic irq抽象出了对控制器的操作与以及对edge or level trigger的处理,那原来__do_IRQ里的哪些代码区别对待了edge-triggered和level-triggered。

较新的处理器对edge or level trigger的处理, 完全由硬件处理,软件只需对软件源进行初始化配置。edge or level trigger决定于中断源。在每个CPU的手册里,都列出该系统所有中断源,中断源对应的序号,edge or level trigger型或两种都可;软件对中断源初始化时,就要决定用edge还是level来产生中断;一旦决定了,如果中断源锁定一个有效的信号,就会在中断控制器把相应的中断信号使能。基本上有硬件完成,软件不区分。

三、8259在不能与CPU与交互的情况下是否能锁存住一次edge-triggered中断。
8259太老了,研究一下powerpc或arm的中断控制器吧
8259和CPU之间应该只是硬件连线,没有程序交互;如果锁存住一次edge-triggered中断,它应该只是硬件上传递一个中断信号到CPU

四、举出具体例子,从中断发出方的视度来看中断的整个流程。如果设备是level-triggered,它什么时候撤消中断信号?如果设备是edge-triggered,某一次边沿变化后,它会马上还原为之前的电平信号还是下一次再想中断时才变化?

如果中断源是CPU自己的外设,如powerpc DSPI送完最后一个frame EDQ(endof queue) bit set, EQQ bit会触发中断;这类中断由CPU生产厂商考虑,不论是edge还是 level trigger;CPU都会保证送到最后一帧时会产生一次中断;如果设备不是CPU外设,而是用户自己设计设备;CPU对输入的中断信号有要求;硬件设计者要进行很多的信号时序匹配测试,保证输出的信号能引起中断,并只中断一次。你的这个问题是硬件的问题,不是软件的问题。

Generic IRQ似乎就是抽象出了一种假想的中断控制器,假定它具有某些操作,然后真正硬件控制器驱动组合使用primitive operations来到达期待的效果。但是初学者不好理解假定的细节啊。比如ack方法有什么效果?level-triggered中断是不是先ack控制器,再ack设备?而edge-triggered中断只需要ack控制器?

这个问题应该是platform dependant.和硬件有关;powerpc,CPU只管有没有中断,不管edge or level trigger;只需ack中断控制器。

另外为什么handle_edge_irq里有个循环而handle_level_irq里没有?irq_check_poll的有什么作用最终达成何种效果?handle_edge_irq注释里的一段话:

不管是edge trigger 还是level trigger,只要中断源发出的中断信号能被中断控制器锁定,这就是一个中断;中断处理程序应该只要知道是哪一个设备发生中断请求,不应关心中断信号是一个edge 还是level;linux里可能有很多太老的设备要维护,所以需要这么分开处理。至于中断查询,用得更少了。


QUOTE:   This requires to reenable the interrupt inside
      of the loop which handles the interrupts which have arrived while
      the handler was running.

这是一个中断嵌套问题,当前有一个中断正在处理,新的优先级高的中断又发生;这是如果中断还是开放状态,当前中断就会被抢夺,转而执行优先级高的中断。
加注释的地方就是告诉你,目前的中断处理到这里时,可以很安全的被抢夺,你可以在这里重新打开中断,如果有更高级中断发生就可及时得到处理。


建议:
如果想研究中断,找新一点的ARM或Powerpc; 花很多时间到老旧产品上不大合适;你问的这些level/edge处理方法,现代硬件用得很少了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP