阅读:1625回复:7
请教PCI卡的中断编程处理
请教PCI卡的中断编程处理
各位高人: 我自己做了一个PCI卡,用的使pci9052芯片,后端用FPGA实现,要实现中断的功能。现正用windriver做驱动,我选用的是电平敏感型的中断触发方式,硬件上每隔2秒产生一次中断信号给INTA#(大约持续0.5秒吧,为了试验),可是在我的程序里要每次要执行上百次的中断响应函数,占用了cpu大量时间,连鼠标动作都慢了,我现在的问题是怎样使中断产生中断后,程序上只执行一次就够了,不让它执行那么多次,请各位出手帮助吧! 我不胜感激! [编辑 - 12/22/04 by xinyancode] |
|
沙发#
发布于:2004-12-22 06:56
9052芯片上应该有一个中断状态寄存器。
中断的处理过程应该是: 1、isr收到操作系统中断信号。 2、isr通过中断状态寄存器查看是否为本驱动对应硬件发送的 中断,因为存在中断复用的问题。 3、如是本硬件发送中断,清除中断状态寄存器。否则退出isr。 4、调用dpc。 |
|
|
板凳#
发布于:2004-12-22 16:32
是的,的确9052里面有个控制寄存器,可以通过软件控制中断是否使能(enable or disable )。
是不是这样,进入中断处理程序后,就使中断disable,不再接受新的中断,等中断处理程序处理完成后,再放开中断控制位,使之可以重新接受中断信号。 我用的是电平敏感型的中断触发方式,高电平触发。是不是等中断处理函数处理后,我硬件中断触发信号应该是低电平了, 否则的话,又会重复调用中断函数? 请指教!非常感谢! [编辑 - 12/22/04 by xinyancode] |
|
地板#
发布于:2004-12-22 21:35
发不了言?
|
|
|
地下室#
发布于:2004-12-22 21:43
首先纠正你一个错误:
你的isr(中断服务例程)所接收到的终端,不是硬件发送给你的,而是操作系统发送给你的。 而操作系统为了使有限的中断资源为更多的中断设备服务,采用了中断复用的方式。即一个中断对应多个中断设备。比如,在irq9上面挂接了三个中断设备,那么如果总线上有irq9,操作系统就给这三个中断设备的驱动发送中断信号。而这三个驱动分别读取这三个设备的中断状态寄存器,如果某个设备驱动读取自己的中断状态寄存器为中断状态,就说明是自己的设备发送的中断,就进入处理程序中。 但注意,在进入中断处理程序前,驱动需要作两件事情: 1、清除中断状态寄存器。 2、清除中断。而不是禁止中断。中断的同步是通过操作系统实现的。 你的问题可能有三种原因: 1、你没有清除中断。 2、由于中断复用,你处理了别人的中断。 3、硬件设备有问题。 中断状态寄存器的中断状态数值,如何清除中断,都应该有硬件设计人员告诉你的。 猜测一下,你是否在开发加密卡驱动? |
|
|
5楼#
发布于:2004-12-22 22:37
今天终于知道jxxy1234是地道的高人!谢谢!谢谢!
您回的帖子我看起来有点力不从心,我初做驱动是用windriver的用户模式做的,还没有牵扯到操作系统的东西。PCI9052的databook中有对中断清除的几句话是这样说的,我引用如下: “ An INTA# assertion generated from either LINTi[2:1]inputs, configured as level-sensitive interrupts, iscleared when one of the following occurs: • Interrupt source is no longer active • Interrupt input pin(s) (LINTi[2:1]) is disabled • PCI interrupts are disabled (INTCSR[6]=0) ” 我在用windriver自动生成的代码中的中断处理程序中,没有发现关于操作系统的处理。 请高人继续指教! 我不胜感激! [编辑 - 12/22/04 by xinyancode] |
|
6楼#
发布于:2004-12-23 15:18
楼主肯定是在连接中断以前,没有把它DISABLE掉!!
[编辑 - 12/23/04 by xucongqi] |
|
|
7楼#
发布于:2005-01-03 19:56
中断模式设置为跳变触发,电平触发在中断服务里要及时清除中断,避免重复触发中断
|
|