【问题标题】:timer doesn't generate interrupts... or what?计时器不会产生中断......还是什么?
【发布时间】:2011-09-11 14:15:53
【问题描述】:

#define TIMER_IVT_ENTRYNUM 0x1C 或者 #define TIMER_IVT_ENTRYNUM 0x08

    prevInt = getvect(TIMER_IVT_ENTRYNUM);
    setvect(TIMER_IVT_ENTRYNUM, currInt);

这就是我设置自己的中断处理程序的方式,如下所示:

void interrupt Timer::currInt(...) {
    (*prevInt)(); //old timer routine
    cout << "TIMER occurence" << endl;

    lock();
    counter++;
    tick(); //empty body

    if ( (Kernel::getRunning() -> getTimeSlice() > 0) )
        if (counter >= Kernel::getRunning() -> getTimeSlice()) {
           unlock();
           dispatch();
           //dispatchInterrupt();
        };

    unlock();
};

无论如何,定时器中断根本不会自行发生...但是如果我使用geninterrupt(TIMER_IVT_ENTRYNUM) 显式调用 int 例程,它就可以工作...

就像计时器本身永远不会产生中断... o.O 我在 Win XP 32bit,Borland C++ 3.1(这是强制性的)

【问题讨论】:

  • 顺便说一句,为了确保程序运行超过 55 毫秒,我在 volatile 变量上加载了数百万次操作,因为我不确定 sleep(seconds) 是否独立于计时器......我想它是,但即便如此,也没有中断执行的证据……

标签: c++ timer operating-system interrupt


【解决方案1】:

你想在 Win XP 中应用一些 DOS 的东西吗?它可以工作的最后一个操作系统是Win98。从WinNT开始,只能在内核模式下直接访问硬件资源,编写内核模式驱动程序。

在您的情况下,尝试为定时器中断处理找到一些等效的用户模式(如多媒体定时器,http://msdn.microsoft.com/en-us/library/dd743609(v=vs.85).aspx),或者开始编写 Windows 驱动程序:http://msdn.microsoft.com/en-us/windows/hardware/default.aspx

关于 Borland C++ 3.1...我真的无话可说:(

【讨论】:

  • 是的,我知道这一切......但这是我的“操作系统”任务,我必须这样做......我与同事核实过,他们都有几乎相同的代码初始化计时器,在处理程序中非常相似...:/
  • 我知道旧评论,但没有理由不应该在 XP 上工作。是的,XP 不允许像 9x 那样直接访问硬件,但是,为了保持与 DOS/Win9x/Win3x 软件的兼容性,它提供了它确实允许旧应用程序访问的仿真硬件。
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 2016-03-01
  • 2018-07-20
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
相关资源
最近更新 更多