таймер не генерирует прерывания или что?

#define TIMER_IVT_ENTRYNUM 0x1C or #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();
};

в любом случае, прерывания таймера вообще не происходят сами по себе... но если я вызову процедуру int явно, используя geninterrupt(TIMER_IVT_ENTRYNUM), она сработает...

Вроде таймер никогда сам не генерирует прерывания... o.O У меня Win XP 32bit, Borland C++ 3.1 (обязательно)


person maricn    schedule 11.09.2011    source источник
comment
Кстати, чтобы гарантировать, что программа работает более 55 мс, я загружаю ее парой миллионов операций с изменчивыми переменными, потому что я не уверен, что sleep(seconds) не зависит от таймера... Я полагаю, что это так, но даже тогда нет никаких доказательств выполнения прерывания...   -  person maricn    schedule 11.09.2011


Ответы (1)


Вы пытаетесь применить некоторые вещи DOS в Win XP? Последней ОС, где он мог работать, была 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... Мне особо нечего сказать :(

person Alex F    schedule 11.09.2011
comment
да, я все это знаю... но это моя задача по операционной системе, я должен сделать так... И я проверил с коллегами, у них у всех примерно одинаковый код для инициализации таймера, и очень похожий в обработчике.. .:/ - person maricn; 11.09.2011
comment
Я знаю старый комментарий, но нет причин, по которым это не должно работать на XP. Да, XP не разрешает прямой доступ к HW, как это делала 9x, но для обеспечения совместимости с программным обеспечением DOS/Win9x/Win3x она предоставляет эмулированное оборудование, к которому она разрешает доступ старым приложениям. - person Stu; 15.01.2014