Ada_Ru форум

Обсуждение языка Ада

Точное измерение времени.

Оставить новое сообщение

Сообщения

Alexey Veselovsky
Точное измерение времени.
2008-04-19 08:45:47

Как точнее всего измерить интервал времени между двумя некими

событиями (в моем случае это интервал между приемами данных с

последовательного порта)?

 

Ну, а потом задача несколько обратная -- через заданные итервалы

времени делать нечто (в данном случае писать в ком-порт). Интервалы времени все разные.

 

PS. OS: Win & Lin. Как обычно хочется обойтить или стандартными

Адскими средствами или гнатскими. Если это возможно конечно.

On Sat, 19 Apr 2008 12:45:47 +0400, you wrote:

 

Как точнее всего измерить интервал времени между двумя некими

событиями (в моем случае это интервал между приемами данных с

последовательного порта)?

 

Ada.Real_Time.Clock.

 

Хотя в зависимости от ОС и компилятора точность может оказаться плохой или вообще ужасной. Производители компиляторов ленивы, используют

POSIX-совместимые вызовы и иже с ними.

 

Не буду тыкать пальцем, но мы имели 33мс! точность Ada.Real_Time.Clock на одной системе, где точность часов процессора была 2нс. Дяди писавшие ОС просто использовали прерывания от системного таймера для своей функции времени. А дяди делавшие компилятор ее попользовали, мотивируя это тем, что подстраивать Ада RTL под каждый процессор им лень. (Подстройка, а мы ее конечно сделали, составила 10 минут работы и 10 строчек кода на Аде. (:-()

Мораль. Обязательно померьте точность Ada.Real_Time.Clock перед тем как использовать. Если не то, смотрите в исходники.

 

Ну, а потом задача несколько обратная -- через заданные итервалы времени делать нечто (в данном случае писать в ком-порт). Интервалы времени все разные.

 

delay until, в задаче пишущей в порт.

 

Если задаче нужно общаться с кем-нибудь еще, можно использовать

delay_alternative в select_statement. Проблемы могут быть те же, только, в зависимости от того, насколько real-time это должно в итоге быть, решать их будет труднее. Через таймер не перепрыгнуть, а busy-waiting на высшем приоритете в мультизадачной системе, это - ни в какие ворота. Можно использовать планировщик Ады, вместо threads, но тогда, про порт можно забыть.

 

Точность delay прямо зависит от системного таймера. Про Linux не скажу, но под Windows NT, 95, 98, Me, 2000 стандартная установка таймера - 10мс. Т.е. ждать можно +/- 10мс. Этот параметр можно уменьшить до 1мс, но не далее. Как там в XP, серверах, и Vista, я не знаю, т.к. уже много лет, как делаю эти дела в каждой задаче, которую я пускаю под Windows. Вызов называется timeBeginPeriod (1).

 

PS. OS: Win & Lin. Как обычно хочется обойтить или стандартными

Адскими средствами или гнатскими. Если это возможно конечно.

 

Вообще-то ни то, ни другое не real-time, а последовательный порт, тем более, как и то, что на другом конце. Проблема мне не очень ясна.

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

Alexey Veselovsky wrote:

Как точнее всего измерить интервал времени между двумя некими

событиями (в моем случае это интервал между приемами данных с

последовательного порта)?

 

Ну, а потом задача несколько обратная -- через заданные итервалы

времени делать нечто (в данном случае писать в ком-порт). Интервалы

времени все разные.

Вот для этого можно попробовать новый Ada 2005

package Ada.Execution_Time.Timers.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти