1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Помогите со "временем"...

Тема в разделе "Программирование", создана пользователем капитан Смоллет, 17.11.05.

  1. капитан Смоллет

    капитан Смоллет Участник

    117
    0
    Подскажите, можно ли использовать в программе временные промежтки меньше 1 мс хотябы на порядок?
    Скажем нужна короткая пауза = 0,1 мс.

    (Язык программирования не важен, но желатель Delphi)
     
  2. Undef $variable

    Undef $variable Гость

    капитан Смоллет
    Вы предпалагаете желатильным Delphi (или Kylix) и хотя я не с тем не с другим не работал но знаю что они тока под Windows или Linux а эти операционки не реалтайм. Гарантировано интервал меньше чем 1 мс Вы вряд ли смогете использовать а тока могете его замерить. Фишка в том что где-та в этих пределах лежит время переключения контекста задачи и если Вы паставите маленький интервал процес может в эта время проста слипнуть и получить управление тока через нескока мс в зависимости от приоритета задачи и версии ОС и т.д. и ваша 0.1 мс привратитсо в 0.1 мс + 15 мс к примеру (В ХР квант равен где-та 15 мс в 2000 по децлу меньше а в 95й ваще 18.2 Гц частота системного таймера)
    Но можна ризкнуть и перепрогромировать таймер или едро операционки тут уж на что фантазии хватит.
    А ваще для таких преложений езть QNX или RTLinux и т.д. и т.п.
    Но на языке Ц (ни знаю как точно пишетсо ево название) езть функция usleep() - можете ёё попробывать токо учтите што када эта функция вызываетсо то процез который иё вызвал блокируедся на таймере и после изтечения времени сново будет вызван но токо если есть процезы с более высоким приаритетом в состоянии РЕДИ то сночала будут обслуживотсо они. Потому на всякий случай перед usleep вызовите ClockPeriod() с маленьким зночением.
    Не знаю работает ли этот кот на Windows но на QNX вроди бес проблем токо что попробовал на интервале 100мкс но правда в системе мало процезов.

    Извеняюсь за орфаграфию. Давно не песал текзты на руском.
     
  3. AlTk

    AlTk Читатель

    10.699
    0
    капитан Смоллет, для получения таких коротких интервалов необходимо использовать расширения реального времени для Windows.
     
  4. капитан Смоллет

    капитан Смоллет Участник

    117
    0

    Это что такое?
     
  5. Undef $variable

    Undef $variable Гость

    Наверна имеетсо введу беблиотека RTX. Это драйвер будильника и планеровщик зодач который цепляетсо в догонку на операцеонку из серии WinNT. Но наскоко мене извесно чтобы делоть паузу или ишо кокие операцеи со временем всеровно надо использовать ейный АПИ и беблеотека эта стоит денех.
     
  6. капитан Смоллет

    капитан Смоллет Участник

    117
    0
    Undef $variable
    А можно тоже самое, только более человечискими словами...
     
  7. Undef $variable

    Undef $variable Новичок

    5
    0
    капитан Смоллет
    "А можно тоже самое, только более человечискими словами"

    Попробуем.

    RTX устонавливает драйвер системново таймера и он роботает в реальном времени. Заодно ставитсо свой планеровщик задач. Планеровщик задач это такая програма которая контролирует выполнение процесов и раздает им процесорное время в зависимости от преоритетов процесов и т.д. Обычно эта програма находитсо в едре операционки а на микроядерных операцеонках типо QNX микроедро вобще состоит из одного планеровщика. Microsoft не даёт нормальным поцанам менять код своево едра (а зря!) потому некоторые поцаны не стали заморачивотсо а проста добавили в систему Windows свой планеровщик. Эта хрень выполняет свои задачи и живет паралельно со стондарным планеровщеком Windows.
    Есесно такое извращение потребовало переделки HAL. Скорее всево вы не знаете чо это такое потому объясняю на пальцах. Эта хрень работает как передаст между реальной програмой и конкретной деталькой вашево любимова железнова друга то есть ПК. Умные поцаны сделали это для тово что бы не заморачивотсо с розличными орхитектурами типо как нескоко процесоров а также ввод-вывод и контролеры прерываний и т.д. Дрова в вашей любимой операцеонке Windows работают с железками не напрямую как в ДОСе а через этот самый HAL. Хорошо хоть в Microsoft не зажали исходники HALa а дают их иногда поюзать нормальным поцанам.
    То есть после всех этих замутов в операцеонке появляетсо 2 планеровщика. Но боже как им работать? Правильные поцоны долго думали и наконец решили - пусть сночала выполняетсо планеровщик реальнова времени а потом если ему делоть нефиг он передает упровление родному планеровщику операцеонки.
    Но в результате такова гебрида получилась полная срань. Програма должна состоять из двух кусков и один кусок работает с одним плонировщеком а другой кусок который выполняет код в режиме реальново времени с другим. Минусы такова дела как минимум в 2х процесах и есче сложность отладки. Кроме тово что б код реальново времени начал выполнятсо на машине надо ставить сначала RTX.
    Потому советую если вы не умеете работать с Ц не лезть в это дело потому что наскоко мне известно Delphi там не и пахло да и CBuilder'om тоже а максимум на чо вы можете ращитывать это VC какой-то там.

    Надеюсь я обьеснял понятно и правельно.


    Извеняюсь за орфаграфию. Давно не песал на руском.

    ЗЫ Сцылка на RTX если вы все токи решитесь на подвиг: http://www.ardence.com/embedded/products.aspx?ID=70
     
  8. капитан Смоллет

    капитан Смоллет Участник

    117
    0
    Undef $variable
    т.е. как я понял, эту "штуку" нужно устанавливать отдельно, следовательно я смогу "ловить" такое время только на своей машине? Верно?
     
  9. Undef $variable

    Undef $variable Новичок

    5
    0
    капитан Смоллет
    Да и кроме того вы сможете так точно измерять время не во всей програме а токо в ее части которая работает с планеровщиком реальново времени.

    ЗЫ. Проще поставить VMWare с ОСРВ типо QNX и часть кода написать под нее. По крайней мере код будит более портабельный и платить за софт не придетсо.

    ЗЫЗЫ. А зочем такая точность если не секрет? Вы что бенчмарк пишете или свой планеровщик?
     
  10. AlTk

    AlTk Читатель

    10.699
    0
    Undef $variable,
    VMWare тоже не бесплатен.
    и у меня есть большие сомнения, что работая через прослойку (VMWare) QNX останется ОСРВ.
     
  11. Undef $variable

    Undef $variable Новичок

    5
    0
    AlTk
    VMWare Player бесплатный.
    Но вы правы. Извените я лохонулся. Конешно операцеонка под VMWare не будет реальново времени.
     
  12. AlTk

    AlTk Читатель

    10.699
    0
  13. капитан Смоллет

    капитан Смоллет Участник

    117
    0
    Undef $variable

    Нет, все гораздо проще, это единственный простой (он же глупый) способ подавать импульсы с высокой частотой на lpt порт. Чтобы добиться промежутка 2кГц - 5кГц. Просто на что хватило знаний и фантазии это на то, что f=1/T, при T=0.1 .. 0.9 мс и получается нужная мне частота.
    Если знаете как это все провернуть по другому, подскажите пожалуйста...
     
  14. pegas

    pegas Участник

    311
    0
    для получения задержки в 0,1 милисекунды с достаточно высокой точностью (порядка 10 мкс) можно использовать следующий API функции QueryPerformanceFrequency и QueryPerformanceCounter. Первая получает частоту высокоточного таймера (фактически частота процессора), вторая для измерения числа тиков между двумя событиями. Как то примерно так это будет выглядеть
    var fr,time1,time2:Int64;

    QueryPerformanceFrequency(fr);
    fcounter:=round(fr/10000);//число тиков в 0,1 мс
    QueryPerformanceCounter(time1);
    repeat
    i:=i+1;//пустая операция создает задержку.
    QueryPerformanceCounter(time2);
    until (time2-time1)>fcounter;
    Конечно многозадачная среда не будет гарантировать точность, но для применения не связанной скажем с управлениям космическим кораблем борздящими просторы вселенной ;)) точность этого метода будет более чем достаточна.
    P.S Кстати, обращения к LPT портам в Win2kи старше- нетривиальная операция, требует драйвера, например такого как GiveIO и сама по себе достаточно продолжительная, так что возможно специальные задержки и не понадобятся.
     
  15. капитан Смоллет

    капитан Смоллет Участник

    117
    0
    pegas

    Это все понятно, но насколько мне известно, эти функции работают в С++, но не на Delphi, у них есть эквивалент?
    К примеру, GetTickCount, кажеться такое не сделает...
     
  16. pegas

    pegas Участник

    311
    0
    Эти функции работают везде, это API функции Windows. приведенный пример написан на Delphi. GetTickCount действительно не даст такой точности. можно также использовать команду ассемблера RDTSC, которая точно завязана на частоту процессора.
     
  17. капитан Смоллет

    капитан Смоллет Участник

    117
    0
    pegas
    Спасибо, пойду проверю...
     
  18. капитан Смоллет

    капитан Смоллет Участник

    117
    0
    pegas
    немного не понял, что такое
    fcounter:=round(fr/10000);//число тиков в 0,1 мс
    точнее, 10000, почему именно это число...