leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1859回复:12

十分头痛!!!!!150分

楼主#
更多 发布于:2005-03-25 20:26
一PCI卡,用于视频点播.
    两种中断,一个是定时的,一个是随机的.
1. 在定时中断发生时,需要向卡的内存写数据,卡将数据发送出去.
2. 随机中断发生时,则是收到用户发送的请求.
3. 定时中断必须马上响应,否则数据会不连贯,影响效果.
4. 随机中断也要响应,但是实时性不强,可以滞后响应.

我的做法:
APP中的线程不停往驱动的双缓冲区送数据(不成功不断重复该动作),定时中断到达后马上处理并将某缓冲区置可写标志(该标志在APP填充新数据变为只读).
将随机中断放在DPC中处理,并且将用户请求送一个链表保存,APP中另外的线程不断地取用户请求并处理.

问题:
    有时候定时中断响应不及时,导致用户方节目数据有抖动.(该问题随机发生).抖动时观察CPU的使用情况,发现比正常情况下低很多.

    调了好久,没有结果,头痛欲裂.
请各位高人帮忙分析原因.谢谢.
leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于: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);
}
leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-03-28 09:08
谢谢各位的提醒.
看数据输出后抖动的现象,应该是因为处理随机中断而导致定时中断丢了一次.在ISR中有开关中断的操作.但又不能不处理.
leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-03-28 09:12
问题在于太难验证.
有时侯几个小时出现一次,稍不注意就看不到,有时候几十分钟就会出现.而且都是与用户的请求相关,随机出现,没有规律.
leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-03-31 21:16
楼上的弟兄是说在硬件中判断吧?
硬件已经是用了多年的卡,现在没有人改了.
我在处理ISR时,对随机中断的处理已经尽可能简单了,但还是没有效果.

leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-05-03 14:36
谢谢大家.
此问题已经解决.
游客

返回顶部