Проблема с системным таймером под DOS

Тема в разделе "WASM.BEGINNERS", создана пользователем delafrog, 5 май 2008.

  1. delafrog

    delafrog New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    10
    На время выполнения цикла маскирую все аппаратные прерывания кроме прервываний от таймера и клавиатуры. (outport(0x21,0xFC);) Правда может оказаться, что во время работы с таймером может прийти прерывание от него самого. Но это можно обойти например так:

    unsigned long counter()
    {
    unsigned long N1,N2,i2,i1;

    N1 = ECntNum; // ECntNum увеличивается на 1 при каждом переполнении регистров таймера
    out(0x43,0x00); // выполняется значительно быстрее 1 мкс.
    N2 = ECntNum;
    i1 = 0xff-inp(0x40);
    i2 = 0xff-inp(0x40);
    if (N1!=N2) N1 = (i2==0) ? N2 : N1; // i2==0 соответсвует первым 256/1193180 микросекундам после очереного return ((N1<<0xf) + (i2<<8)+i1); //переполнения
    }

    ...


    Но решение проблемы оказалось в другом. Как заметил Clerk, обнаружилось некорректное программирование таймера. При запусте из IDE borlandc 3.1 таймер работает в режиме 2 (управл. слово 0xB4), а при выходе в DOS таймер переходит в режим 3 (управл. слово 0xB6). В программе нигде не менялся режим работы таймера, поэтому и получался разный режим работы. Перевод таймера в режим 2 на время работы программы решил обсуждаемую проблему.
    Таким образом проблему можно считать закрытой. Всем спасибо за помощь.

    P.S.
    С выложеным здесь dos_fastimer я не смог пока ознакомится - никак не распакую архив. Видимо что-то не так с архиватором у меня на компе...
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    delafrog
    Тебе же выложили zip. А проблема - у меня тоже были, когда пользовался слишком старыми версиями
    архиваторов и командера. Но обычно сами архиваторы хорошо совместимы, вот плаги всякие - там масса несовместимостей было раньше.