xinyancode
驱动小牛
驱动小牛
  • 注册日期2003-08-15
  • 最后登录2008-09-30
  • 粉丝1
  • 关注1
  • 积分3分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1625回复:7

请教PCI卡的中断编程处理

楼主#
更多 发布于:2004-12-22 00:13
请教PCI卡的中断编程处理

各位高人:

我自己做了一个PCI卡,用的使pci9052芯片,后端用FPGA实现,要实现中断的功能。现正用windriver做驱动,我选用的是电平敏感型的中断触发方式,硬件上每隔2秒产生一次中断信号给INTA#(大约持续0.5秒吧,为了试验),可是在我的程序里要每次要执行上百次的中断响应函数,占用了cpu大量时间,连鼠标动作都慢了,我现在的问题是怎样使中断产生中断后,程序上只执行一次就够了,不让它执行那么多次,请各位出手帮助吧!


我不胜感激!

[编辑 -  12/22/04 by  xinyancode]
jxxy1234
驱动牛犊
驱动牛犊
  • 注册日期2002-05-16
  • 最后登录2012-08-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-22 06:56
9052芯片上应该有一个中断状态寄存器。

中断的处理过程应该是:
1、isr收到操作系统中断信号。
2、isr通过中断状态寄存器查看是否为本驱动对应硬件发送的
中断,因为存在中断复用的问题。
3、如是本硬件发送中断,清除中断状态寄存器。否则退出isr。
4、调用dpc。
鬼子就是鬼子,永远变不成人!
xinyancode
驱动小牛
驱动小牛
  • 注册日期2003-08-15
  • 最后登录2008-09-30
  • 粉丝1
  • 关注1
  • 积分3分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-22 16:32
是的,的确9052里面有个控制寄存器,可以通过软件控制中断是否使能(enable or disable )。

是不是这样,进入中断处理程序后,就使中断disable,不再接受新的中断,等中断处理程序处理完成后,再放开中断控制位,使之可以重新接受中断信号。

我用的是电平敏感型的中断触发方式,高电平触发。是不是等中断处理函数处理后,我硬件中断触发信号应该是低电平了, 否则的话,又会重复调用中断函数?


请指教!非常感谢!

[编辑 -  12/22/04 by  xinyancode]
jxxy1234
驱动牛犊
驱动牛犊
  • 注册日期2002-05-16
  • 最后登录2012-08-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-22 21:35
发不了言?
鬼子就是鬼子,永远变不成人!
jxxy1234
驱动牛犊
驱动牛犊
  • 注册日期2002-05-16
  • 最后登录2012-08-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-22 21:43
首先纠正你一个错误:
你的isr(中断服务例程)所接收到的终端,不是硬件发送给你的,而是操作系统发送给你的。
而操作系统为了使有限的中断资源为更多的中断设备服务,采用了中断复用的方式。即一个中断对应多个中断设备。比如,在irq9上面挂接了三个中断设备,那么如果总线上有irq9,操作系统就给这三个中断设备的驱动发送中断信号。而这三个驱动分别读取这三个设备的中断状态寄存器,如果某个设备驱动读取自己的中断状态寄存器为中断状态,就说明是自己的设备发送的中断,就进入处理程序中。
但注意,在进入中断处理程序前,驱动需要作两件事情:
1、清除中断状态寄存器。
2、清除中断。而不是禁止中断。中断的同步是通过操作系统实现的。

你的问题可能有三种原因:
1、你没有清除中断。
2、由于中断复用,你处理了别人的中断。
3、硬件设备有问题。

中断状态寄存器的中断状态数值,如何清除中断,都应该有硬件设计人员告诉你的。

猜测一下,你是否在开发加密卡驱动?
鬼子就是鬼子,永远变不成人!
xinyancode
驱动小牛
驱动小牛
  • 注册日期2003-08-15
  • 最后登录2008-09-30
  • 粉丝1
  • 关注1
  • 积分3分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
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]
xucongqi
驱动牛犊
驱动牛犊
  • 注册日期2003-12-17
  • 最后登录2008-01-04
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-23 15:18
楼主肯定是在连接中断以前,没有把它DISABLE掉!!

[编辑 -  12/23/04 by  xucongqi]
长沙PCI开发、WDM驱动开发请联系!!xucongqi1981@163.com
gogo2000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2005-10-06
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-03 19:56
中断模式设置为跳变触发,电平触发在中断服务里要及时清除中断,避免重复触发中断
游客

返回顶部