leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1850回复: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);
}
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-26 23:35
对于频繁使用内存的情况,建议你先分配一定内存空间,循环使用
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-28 08:28
首先判断APP还是驱动哪个是影响数据写入的瓶颈
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
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分
  • 社区居民
5楼#
发布于:2005-03-28 09:12
问题在于太难验证.
有时侯几个小时出现一次,稍不注意就看不到,有时候几十分钟就会出现.而且都是与用户的请求相关,随机出现,没有规律.
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-28 09:42
问题在于太难验证.
有时侯几个小时出现一次,稍不注意就看不到,有时候几十分钟就会出现.而且都是与用户的请求相关,随机出现,没有规律.

做个程序监视一下驱动的缓冲区,如果缓冲区较满,是驱动的瓶颈,如果较空,是APP的问题,看你说的\"都是与用户的请求相关\",估计是APP的问题,可以提高APP优先级和做成多线程
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
yjhleaf
驱动小牛
驱动小牛
  • 注册日期2001-11-04
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-30 19:48
最好从产生中断的地方想办法,既然随机中断可以不实时,那就每次产生的时候判断下定时中断,硬件加延时。
忽如一夜春风来,千树万树梨花开。
leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-03-31 21:16
楼上的弟兄是说在硬件中判断吧?
硬件已经是用了多年的卡,现在没有人改了.
我在处理ISR时,对随机中断的处理已经尽可能简单了,但还是没有效果.

yjhleaf
驱动小牛
驱动小牛
  • 注册日期2001-11-04
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-04-06 20:30
是的,我认为得从硬件中断产生的时候加延迟。从驱动软件方面解决,我也不知道有什么好办法,不如你换个RTOS系统开发啊。
忽如一夜春风来,千树万树梨花开。
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-04-07 14:21
随机中断的用户请求在应用层处理,不行吗
second
leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2005-05-03 14:36
谢谢大家.
此问题已经解决.
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-05 16:43
谢谢大家.
此问题已经解决.

HOW TO
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部