阅读:1089回复:2
关于系统进程和定时的问题请教大侠
我在驱动程序中启动了一个系统进程,系统进程的代码如下:
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。不稳定的时候,则波形周期无法测量。真的不知是为什么。有大侠可以帮我看看问题出在什么地方吗? |
|
沙发#
发布于:2004-10-02 20:50
系统线程运行在IRQL=PASSIVE,提升Priority不如提升IRQL
|
|
板凳#
发布于:2004-10-09 05:12
20ms/20us:
因为时间片的缘故,在多数x86平台上,时间片是10ms/单CPU, 15ms/SMP。当你的系统线程放弃运行时,另外一个线程将会运行。而且调度程序在其时间片到期前,不会在进行线程调度。所以,尽管定时器到时,你的系统线程也只是被放到队列里,直到10ms的时间片到期才会被调度。 另外,正像symon说的, IRQL=PASSIVE意味着中断程序,APC/DPC 等等都会影响你的系统线程的调度。WINDOWS不是一个实时操作系统。 |
|