IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Работа с таймером., Таймер высокого разрешения
сообщение
Сообщение #1


Гость






И так такт таймера по умолчанию составляет 55 мс. Но в жизни есть такие чудесные моменты, когда требуется, что-нибудь периодически выполнять через 20 мс, 10 мс или даже 1 мс. В сети выложены примеры быстрых таймеров, но, честно говоря, что к чему в них я так понять и не смог. Из не проверенных данных я знаю, что изменить такт таймера с 55 мс на 10 мс условно говоря просто, вот только ни где не сказано как это сделать. Как получают более мелкие такты для меня большая загадка.
Просветите, пожалуйста.

Примеры перепрограммирования частот системного таймера находятся здесь:
http://pascal.sources.ru/datetime/index.htm

PS Я не программист, так балуюсь, С и Асм’у не обучен.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


нашел....
Пишем модуль для работы с системным таймером.

Цитата
Пишем модуль для работы с системным таймером

Часто при программировании в некоторых местах программы необходимо замерять время исполнения кода, в других просто останавливать выполнение не некоторое время. Например, если писать игру, необходимо создавать код, который бы ограничивал скорость игры. Конечно, если игра очень тяжелая, то некоторое время она может существовать без такого ограничителя. Но со временем вычислительная мощь компьютеров растет (к сожалению не сама по себе) и в игры без ограничителя скорости играть становится невозможно. Или вы решили написать бенчмарк для процессора. Тут уже нужны очень точные средства для замера времени исполнения кода. Таких примеров можно привести уйму. Проще сказать, что в любой более-менее серьезной программе измерение времени просто необходимо. К сожалению штатные средства в Паскале ограничиваются только процедурой Delay что описана в модуле CRT. Но она очень сильно зависит от производительности системы. Конечно, можно использовать процедуру GetTime, но она довольно громоздка. А стандартных процедур по замеру времени выполнения кода вообще нет.

Ну и не надо! Мы ведь не чайники? Конечно, не чайники! Сами напишем. При написании программ последовательный код стараются объединить в циклы. Код, повторяющийся в программе выносят в отдельные процедуры и функции. А код, который явно будет использоваться не в одной программе, выносят в модули. Мы так и сделаем. Давайте создадим в Паскале файл TIMER.PAS и начнем. Как известно название модуля и файла должны совпадать, поэтому пишем:

Unit Timer;


Далее необходимо создать интерфейсную часть модуля. Тут давайте остановимся и разберемся что нам нужно. Во-первых нам нужны средства для измерения времени исполнения кода. Во-вторых средства по остановке программы на определенное время. Кроме того, при остановке может, понадобится вывод времени, которое прошло.


interface
procedure Start (var T:longint);
procedure Stop (var T:longint);
procedure Pause (T:longint; Show:boolean);


Итак, мы объявили три процедуры. Процедуры Start и Stop будут служить для измерения времени выполнения кода, а Pause станет заменой Delay. Переменная T - будит служить для передачи данных о времени. Show - для разрешения или запрещения вывода времени на экран. Далее следует исполнительная часть. Она служит для объявления локальных констант, переменных и типов. В данном модуле они нам не нужны:

Implementation


Далее следует самое интересное. Вы еще не задумывались каким же способом мы будем производить замер времени? А почему бы не использовать аппаратный таймер? Тем более это очень просто:

SystemTimer:longint absolute $0040:$006C;


Вот и все! Нет, модуль не весь, но мы имеем полный доступ к аппаратному таймеру, расположенному по физическому адресу $0040:$006C. Значение двойного слова по этому адресу увеличивается на единицу 18.2 раза в секунду и не зависит от производительности системы. Нам осталось только написать примитивные процедуры для оперирования с таймером:

procedure Start (var T:longint);
begin
T:=SystemTimer;
end;
procedure Stop (var T:longint);
begin
T:=SystemTimer-T;
end;

procedure Pause (T:longint; Show:boolean);
var Xn,Xt:longint;
begin
Xt:=0;
Xn:=SystemTimer;
While ((Xt-Xn)/18.2)*1000 < T do
begin
Xt:=SystemTimer;
If Show then
writeln((xt-xn)/18.2:6:4)
end;
end;


Ну, и долгожданный


end.


Все, компилируем. Хочется сразу проверить работу, не так ли?

Program TimerPrimer;
uses timer;
Var i : integer;
a :Real;
Time : LongInt;
begin
Randomize;
Start(Time);
For i:=1 to 30000 do
a:=Sin(sqrt(i))*Cos(sqrt(Random(10000)));
Stop(Time);
Writeln('Время выполнения: ',Time/18.2:6:4);
Readln;
Pause(10000, True);
end.



Данная программа демонстрирует возможности модуля Timer. В начале она исполняет цикл от 1 до 30000 в котором высчитывает значение а. Время выполнения этого цыкла и замеряют наши процедуры Start и Stop. После чего, дождавшись нажатия на Enter делаем паузу на 10.000 секунд с разрешаем процедуре Pause осуществлять вывод на экран.

Теперь вы сможете использовать точный таймер в своих программах. А почему же я не воспользовался процедурой GetTime? Только из-за ее громоздкости? Конечно нет. Посмотрите на код. Что мы собственно использовали? Только прямой доступ к физическому адресу аппаратного таймера. Так кто мешает использовать его в других языках программирования? Вот тут то и оно.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Shub   Работа с таймером.   9.04.2004 13:30
Altair   А здесь можно узнать, как программировать таймер с…   16.04.2004 10:30
Shub   Спасибо, хоть там и много асма, но сообщения Vespe…   19.04.2004 14:30
Altair   Кстати очень интересную ссылку подкинул Shub, заме…   19.04.2004 18:02
Shub   Попробовал то, что предложил Vesper (имеется в вид…   19.04.2004 21:06
Altair   Хм .... Надо попробовать самому. Я тоже интерисую…   19.04.2004 21:45
Altair   Так, так .... читаем, что тут: http://www.dklab.r…   19.04.2004 22:53
Shub   Так добавлю еще одну ссылку: http://www.vcl.ru/htm…   20.04.2004 12:53
Shub   Мои попытки ускорить таймер потерпели фиаско. Port…   21.04.2004 20:56
Altair   Вот, что у Питера Нортона написано: Т.е. программ…   21.04.2004 23:52
Shub   Е-е-е, получилось. Значиться так: 43h - управляющ…   22.04.2004 13:57
Shub   Сорри, в моем примере надо вводить не 256, а 1, то…   22.04.2004 16:27
Altair   Shub, высший класс! А выше скорость не выйдет,…   22.04.2004 17:36
Guest   Спасибо :), я в курсе, что скорость выше не буде…   22.04.2004 18:17
Altair   нашел.... Пишем модуль для работы с системным тайм…   11.03.2005 2:29
xds   f = 1193180 Гц / c где с = коэффициент деления (ч…   11.03.2005 8:20
xds   Пример программирования таймера (используется для …   11.03.2005 8:45
Aelita   А как переделать Вашу программу, если нужно еще в …   14.11.2010 9:13
Lapp   А как переделать Вашу программу, если нужно еще в …   14.11.2010 13:25
Aelita   Я работаю, как ни странно, под DOS32 (Free Pascal)…   15.11.2010 11:01
Lapp   Я работаю, как ни странно, под DOS32 (Free Pascal)…   15.11.2010 13:17
TarasBer   Что же это за код такой, что его работа так сильно…   15.11.2010 16:59


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 6:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name