julan
驱动小牛
驱动小牛
  • 注册日期2001-11-23
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1970回复:4

中断服务程序要做些什么?

楼主#
更多 发布于:2002-04-18 10:54
echo
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-13 09:06
要记得清中断,呵呵
早起早睡 精神百倍
Brifan_qudong
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2004-11-26
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-11 10:32
在ds中可以这么写程序:
参考一下嘛:)
BOOLEAN IntwdmDwvice::Isr_irq(void)
{
if(IsOurInterrupt())
{
m_DpcFor_Irq.Request();
return TRUE;
}
else
return FALSE;
}

VOID IntwdmDevice::DpcFor_Irq(PVOID Arg1,PVOID Arg2)
{
//TODO:添加你的中断任务代码
}

大家多交流,我觉得DS很容易上手:)
我们都是朋友。
wuqix
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2008-06-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-19 04:10
基本上看你想干什么了,比如中断来了你只想写个控制字,isr里做就行了,如果要启动dma,一般数据量挺大时,isr里启动一下,再开个dpc做传输。Tom_lyd说的是标准做法,你要是很明白硬件到底要干什么,也可以稍微变通一下,只要不做dma或不与用户层打交道也不牵涉延时等等,dpc就可以免了。isr的过程Tom_lyd已经说的很清楚了,我就不再重复了:)
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-18 11:53
ISR例程运行在DIRQL级别,不宜做过多的事情。凡是碰到要挂接中断的程序必须注册DPC例程,将一些操作放到这些延迟例程里面去做。
具体说来,ISR中一般做这些事情:
1:确定中断是否属于该驱动程序。如果不属于,则立刻返回;
2:执行设备确认中断所需的任何操作。
3:确定是否还有数据要传输。如果还有,开始下一个设备操作。这就将最终导致另一个中断。
4:如果所有数据已经被传输(或者发生一个设备错误),通过调用IoRequestDpc排队DPC请示。
5:返回TRUE值。
以下是一段示例代码:
BOOLEAN    Isr( IN PKINTERRUPT pIntObj,
                IN PVOID pServiceContext)
{
    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pServiceContext;
PDEVICE_OBJECT pDevObj= pDevExt->pDevice;
PIRP pIrp = pDevObj->CurrentIrp;
if( GetIrq()!=MyIrq ) //GetIrq is a user defined function
   return FALSE;
if( bLeftBytes == 0) //finished all transfer
   IoRequestDpc(pDevObj,pIrp,(PVOID)pDevExt); //pDevExt used as context.
return TRUE;
Tom_lyd
游客

返回顶部