flywell
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2005-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1089回复:2

关于系统进程和定时的问题请教大侠

楼主#
更多 发布于:2004-10-01 15:01
我在驱动程序中启动了一个系统进程,系统进程的代码如下:

UCHAR  ucSysThreadTermFlag=0;

void SystemDAThreadEntry(IN PVOID StartContext)
{
   LARGE_INTEGER   liTimerIntv;
   UCHAR ucFlag=0;

   //设置进程优先级
   KeSetPriorityThread(KeGetCurrentThread(),
                       LOW_REALTIME_PRIORITY);

   while ( 1 )
   {
      if(ucFlag)
      {
         WRITE_PORT_UCHAR( (PUCHAR)(GV_pIoBaseAddress+0x18),0);
         WRITE_PORT_UCHAR( (PUCHAR)(GV_pIoBaseAddress+0x19),0);     //输出低电平
         ucFlag=0;
       }
       else
       {
         WRITE_PORT_UCHAR( (PUCHAR)(GV_pIoBaseAddress+0x18),0xff);
         WRITE_PORT_UCHAR( (PUCHAR)(GV_pIoBaseAddress+0x19),0xff);   //输出高电平
         ucFlag=1;
        }

        if ( ucSysThreadTermFlag ) break;  //Terminate this thread.

        liTimerIntv.QuadPart=-100;
        KeDelayExecutionThread(KernelMode, FALSE, &liTimerIntv);
   }
}

  可是用示波器看波形,不是很稳定。当稳定的时候,周期是20ms, 而不是20us。不稳定的时候,则波形周期无法测量。真的不知是为什么。有大侠可以帮我看看问题出在什么地方吗?
symon
驱动牛犊
驱动牛犊
  • 注册日期2001-09-19
  • 最后登录2011-06-29
  • 粉丝1
  • 关注1
  • 积分6分
  • 威望55点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-02 20:50
系统线程运行在IRQL=PASSIVE,提升Priority不如提升IRQL
xqchen
驱动牛犊
驱动牛犊
  • 注册日期2001-09-07
  • 最后登录2004-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-09 05:12
20ms/20us:

因为时间片的缘故,在多数x86平台上,时间片是10ms/单CPU, 15ms/SMP。当你的系统线程放弃运行时,另外一个线程将会运行。而且调度程序在其时间片到期前,不会在进行线程调度。所以,尽管定时器到时,你的系统线程也只是被放到队列里,直到10ms的时间片到期才会被调度。

另外,正像symon说的, IRQL=PASSIVE意味着中断程序,APC/DPC 等等都会影响你的系统线程的调度。WINDOWS不是一个实时操作系统。
游客

返回顶部