阅读:982回复:3
救命:为什么中断服务函数不能优先执行???
这个问题困扰我已经很久了,我使用DriverStudio自己编写研华采集卡PCL818L的驱动,目的是想能够捕获采集过程的中断,并且在中断处理函数中进行:A/D读取数据-控制运算-D/A控制信号输出,通过设置采集卡的8254获得了1K的采样速率,每采一个值后采集卡会发送中断信号。我这里用的是3号中断。
问题是:程序运行后,如果不刷屏,也不移动鼠标,控制结果没有问题,但是稍稍移动鼠标或者窗口的话就控制不了了,完全计算错误,输出为0。我如果将下面的语句中//ts.Counter=(ULONG)m_PID.Kp;注释去掉的话,就能控制住了,但是用户级的程序还是对控制有部分影响,按常规理解,//ts.Counter=(ULONG)m_PID.Kp;这一句是可有可无的,因为它后面还有ts.Counter=m_InterruptCount;。我是新手,不明白其中的原因,猜测可能是鼠标中断或其他中断对我响应的3号中断处理函数的执行有影响,我的中断处理不能实时进行。哪位大侠能告知怎么解决,谢了先,大量散分! 下面贴出中断处理代码: BOOLEAN InterruptDemoDevice::Isr(void) { T << "In the ISR\n"; //读取板卡中断状态 UCHAR ADStatus=m_IoRange.inb(8); UCHAR tmp=ADStatus&(0x10); if(tmp!=0x10) { return FALSE; } T << "Begin Control\n"; __try { VIEWIO ts; double u,y; //ts.Counter=(ULONG)m_PID.Kp; ++m_InterruptCount; ts.Counter=m_InterruptCount; int ADdata=m_IoRange.inw(0); ADdata=ADdata>>4; y=20/4096.0*(ADdata-2048); double rin=6; T << "rin="<<(ULONG)rin<<",ADdata="<<(ULONG)ADdata<<"\n"; u=m_PID.PID_Normal_Control(rin,y); ts.OutData=y; ts.InData=rin; T << "u="<<(ULONG)u<<",y="<<(ULONG)ts.OutData<<"\n"; if(u>=4095)u=4095; if(u<=0)u=0; USHORT DAdata,lDAdata,hDAdata; DAdata=(USHORT)u; DAdata=DAdata<<4; lDAdata=DAdata&255; hDAdata=DAdata>>8; hDAdata=hDAdata&255; m_IoRange.outb(4,(UCHAR)lDAdata); m_IoRange.outb(5,(UCHAR)hDAdata); m_VIEWIOFifo.Lock(); m_VIEWIOFifo.Write(&ts, 1); m_VIEWIOFifo.Unlock(); m_IoRange.outb(8,0); } __except(EXCEPTION_EXECUTE_HANDLER) { T << "Control Error\n"; } T << "End Control\n"; return TRUE; } |
|
|
沙发#
发布于:2004-08-12 16:33
没做过,
不过可以问问DS的技术支持工程师啊。 |
|
|
板凳#
发布于:2004-08-12 16:35
提高优先级试试! :D
|
|
地板#
发布于:2004-08-12 16:39
做过和你一样的东东,也是818,但不是用ds,用的windriver,没有出现你说的这种情况!
|
|