阅读:1850回复:12
十分头痛!!!!!150分
一PCI卡,用于视频点播.
两种中断,一个是定时的,一个是随机的. 1. 在定时中断发生时,需要向卡的内存写数据,卡将数据发送出去. 2. 随机中断发生时,则是收到用户发送的请求. 3. 定时中断必须马上响应,否则数据会不连贯,影响效果. 4. 随机中断也要响应,但是实时性不强,可以滞后响应. 我的做法: APP中的线程不停往驱动的双缓冲区送数据(不成功不断重复该动作),定时中断到达后马上处理并将某缓冲区置可写标志(该标志在APP填充新数据变为只读). 将随机中断放在DPC中处理,并且将用户请求送一个链表保存,APP中另外的线程不断地取用户请求并处理. 问题: 有时候定时中断响应不及时,导致用户方节目数据有抖动.(该问题随机发生).抖动时观察CPU的使用情况,发现比正常情况下低很多. 调了好久,没有结果,头痛欲裂. 请各位高人帮忙分析原因.谢谢. |
|
沙发#
发布于:2005-03-25 20:36
贴出中断处理以及DPC部分代码如下:
BOOLEAN XX01Device::Isr(void) { UCHAR uFlag = MyPort.inb(); if (!(uFlag & 0x7)) { return FALSE;//不是我的中断 } MyPort.outb(0, 0x00);//关中断 if ( !(uFlag & 0x4 ) && (uFlag & 0x1) )//定时中断 { m_DeviceStatus.m_dwIntCount ++; WriteDataToMM();//送数据 MyPort.outb(0, 0x80);//开中断 return TRUE; } XX01_ISR_REASON reason = IsrReasonNone; if ( m_DeviceStatus.m_chWorkMode && (uFlag & 0x2))//随机中断 { m_Channel = MyPort.inb(0x08); USHORT usCmd = MyPort.inw(0x09); m_Command = (((usCmd & 0x00FF) << 8) | (usCmd >> 8)); reason = IsrReasonCommand; } if ( reason != IsrReasonNone) m_XX01IsrDpc.Request((PVOID)reason, NULL); MyPort.outb(0, 0x80);//开中断 return TRUE; } VOID XX01Device::IsrDpc(PVOID Arg1, PVOID Arg2) { XX01_ISR_REASON reason = (XX01_ISR_REASON)(ULONG_PTR) Arg1; if (reason == IsrReasonCommand ) { if ( m_Channel < m_DeviceStatus.m_chActiveChannels && m_Command != 0xFFFF) { PXX01_REQ p = new (NonPagedPool)XX01_REQ; RtlZeroMemory(p, sizeof(XX01_REQ)); p->Channel = m_Channel; p->Command = m_Command; m_ReqList.InsertTailAtDpc(p); } m_Channel = 0xFF; m_Command = 0xFFFF; } UNREFERENCED_PARAMETER(Arg2); } |
|
板凳#
发布于:2005-03-26 23:35
对于频繁使用内存的情况,建议你先分配一定内存空间,循环使用
|
|
|
地板#
发布于:2005-03-28 08:28
首先判断APP还是驱动哪个是影响数据写入的瓶颈
|
|
|
地下室#
发布于:2005-03-28 09:08
谢谢各位的提醒.
看数据输出后抖动的现象,应该是因为处理随机中断而导致定时中断丢了一次.在ISR中有开关中断的操作.但又不能不处理. |
|
5楼#
发布于:2005-03-28 09:12
问题在于太难验证.
有时侯几个小时出现一次,稍不注意就看不到,有时候几十分钟就会出现.而且都是与用户的请求相关,随机出现,没有规律. |
|
6楼#
发布于:2005-03-28 09:42
问题在于太难验证. 做个程序监视一下驱动的缓冲区,如果缓冲区较满,是驱动的瓶颈,如果较空,是APP的问题,看你说的\"都是与用户的请求相关\",估计是APP的问题,可以提高APP优先级和做成多线程 |
|
|
7楼#
发布于:2005-03-30 19:48
最好从产生中断的地方想办法,既然随机中断可以不实时,那就每次产生的时候判断下定时中断,硬件加延时。
|
|
|
8楼#
发布于:2005-03-31 21:16
楼上的弟兄是说在硬件中判断吧?
硬件已经是用了多年的卡,现在没有人改了. 我在处理ISR时,对随机中断的处理已经尽可能简单了,但还是没有效果. |
|
9楼#
发布于:2005-04-06 20:30
是的,我认为得从硬件中断产生的时候加延迟。从驱动软件方面解决,我也不知道有什么好办法,不如你换个RTOS系统开发啊。
|
|
|
10楼#
发布于:2005-04-07 14:21
随机中断的用户请求在应用层处理,不行吗
|
|
|
11楼#
发布于:2005-05-03 14:36
谢谢大家.
此问题已经解决. |
|
12楼#
发布于:2005-05-05 16:43
谢谢大家. HOW TO |
|
|