首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows XP中的100 kHz计时器频率

Windows XP中的100 kHz计时器频率
EN

Stack Overflow用户
提问于 2009-12-09 01:45:15
回答 16查看 5.5K关注 0票数 6

有一个流行的业余爱好级别的数控机床控制,它在Windows XP中运行,它有一个定时器,以用户可选的速率运行,范围从25 kHz到100 kHz。

碰巧我也做数控机床控制器,但我一直在使用Galil运动控制公司的DMC1800系列数字信号处理器运动控制器板,它是由我的上层程序控制的。有一些潜在的买家买不起这种配置,所以我写了另一个应用程序,我计划将其作为基于软件的控制包提供。这个应用程序已经完成了,除了我没有计时器。(MS多媒体计时器是不够的。)

为了避免混淆,我指的是能够以100 kHz频率工作的周期性计时器,而不是秒表计时器。

EN

回答 16

Stack Overflow用户

发布于 2009-12-09 01:52:06

不可能。Windows上可用的最快计时器是1ms (1 kHz)。你需要一个实时操作系统或者一个专用的控制器。即使是在实时操作系统中,通常最高也只有20 kHz。

票数 9
EN

Stack Overflow用户

发布于 2009-12-09 02:27:01

这个计时器到底需要做什么?如果它只需要输出一个在25 kHz到100 kHz之间的方波,那么你将需要额外的硬件,但不是非常昂贵的硬件。例如,看看这个来自数据转换的DT-340。它甚至可以比你需要的更快,我相信它甚至可以触发中断。或者这个PCI 8255/8254 48 I/O

如果你的预算能负担得起500美元左右,那么应该有很多硬件选择。实际的可编程定时器芯片应该比这便宜得多,所以如果你愿意把你自己的电路连接到电脑上,你可能会比500美元做得更好。

我曾经围绕Intel8253可编程时间间隔计时器芯片构建了一个电路,该芯片在最初的IBM PC内部用于从内部扬声器发出嘟嘟声。它被连接到一个1.193182 MHz的晶体上,并有一个16位分频器。这个芯片已经存在了几十年了。如果你需要更好的,我相信从那时起已经有了改进。

当我说PC内部的8253 (或8254)芯片用于驱动内置扬声器时,我并不完整。在维基百科上有更多关于Intel 8253的信息。这里解释了输出0用于产生时钟中断,输出1用于DRAM刷新时序,输出2用于驱动内部扬声器。

前两个时钟输出会生成中断,这正是您想要的,但上面对这些输出当前作用的描述应该会让您稍作停顿,以反映更改它们的行为可能会导致Windows XP注意到这一点。扬声器的第三个输出,基本上是无害的,但如果你需要的话,你需要找出一些方法将信号重定向到产生和中断的东西上。

马赫3可能使用的是High Performance Event Timer,根据here的说法,HPET是最近英特尔芯片组的一部分。定时器0和1用于8254仿真。

“ICH HPET定时器2中断可以通过TIM2_CONF寄存器路由到下列IRQ中的任何一个: 11、20、21、22和23。(注:此寄存器在英特尔®ICH5中称为TIM3_CONF。)”

票数 9
EN

Stack Overflow用户

发布于 2009-12-09 02:12:16

在当前的CPU上,使用循环中的QueryPerformanceCounter可以获得接近100 kHz的轮询。

例如:

代码语言:javascript
运行
复制
typedef void ( *CallbackProc )();

void PollAtKhz( int khz, CallbackProc const &Callback )
{
    int hz = khz * 1000;
    LARGE_INTEGER li;

    QueryPerformanceFrequency( &li );

    if( li.QuadPart < hz )
        return;

    __int64 diff = li.QuadPart / hz;
    LARGE_INTEGER NextStop;
    LARGE_INTEGER CurStop;

    QueryPerformanceCounter( &NextStop );
    NextStop.QuadPart += diff;

    while( true )
    {
        QueryPerformanceCounter( &CurStop );

        if( CurStop.QuadPart >= NextStop.QuadPart )
        {
            Callback();

            QueryPerformanceCounter( &NextStop );
            NextStop.QuadPart += diff;
        }
    }
}

在我的测试中,我得到了大约92-98 kHz的频率,使用以下代码来测试它:

代码语言:javascript
运行
复制
void TestCallBack()
{
    static int i = 0;
    static time_t LastTime = time( NULL ) + 1;

    ++i;
    if( time( NULL ) >= LastTime )
    {
        printf( "%d / sec\r\n", i );
        LastTime = time( NULL ) + 1;
        i = 0;
    }
}

显然,这段代码需要最大的CPU使用率,因此要获得这些结果,必须使用SMP机器。此外,将进程/线程优先级提升到实时也会有所帮助。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1868642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档