Таймер в Linux (Программные миллисекундные часы)

Модератор: Модераторы разделов

Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Таймер в Linux

Сообщение deninok »

Доброго всем времени суток!

Итак, проблема. Есть Линуксовый компьютер, на котором запускается некая программа, и этой программе необходим особый "программный таймерный механизм". Суть этого механизма в том, что он (будучи один раз запущенным на стадии инициализации программы) должен через каждую, например, 1 миллисекунду прерывать ход программы и инициировать определённое действие (например, вызывать некоторую функцию). Иными словами, данный "таймерный механизм" должен предоставлять программе, скажем так, "миллисекундные часы".

Вопрос: как в Linux реализовать подобного рода "программный таймерный механизм"?

Заранее благодарен за ответы.
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Таймер в Linux

Сообщение d_n_k »

все сказанное есть имхо...
Спасибо сказали:
Galaxy Master
Сообщения: 142
ОС: Debian GNU/Linux

Re: Таймер в Linux

Сообщение Galaxy Master »

deninok писал(а):
07.06.2008 22:41
Доброго всем времени суток!

Итак, проблема. Есть Линуксовый компьютер, на котором запускается некая программа, и этой программе необходим особый "программный таймерный механизм". Суть этого механизма в том, что он (будучи один раз запущенным на стадии инициализации программы) должен через каждую, например, 1 миллисекунду прерывать ход программы и инициировать определённое действие (например, вызывать некоторую функцию). Иными словами, данный "таймерный механизм" должен предоставлять программе, скажем так, "миллисекундные часы".

Вопрос: как в Linux реализовать подобного рода "программный таймерный механизм"?

Заранее благодарен за ответы.


1. Вы вообще отдаете себе отчет в том, как звучит ваш вопрос для не посвященного в вашу проблему? (что за программа? вы ее пишете или это бинарь без исходников?)
2. Если это какой-то бинарь, то тему можно закрывать.
3. Если это не бинарь, то тему все равно можно закрывать, если только ваша программа не кернельный модуль.
4. Если вы немного поумерите аппетит на счет 1мс, то есть 2 варианта решения:
1. Правильно организовать рабочий цикл программы и узнавая время с помощью clock_gettime() дергать вашу ф-цию.
2. Если ваш рабочий цикл для первого варианта организовать не можете, то создать поток, который будет засыпать nanosleep() и дергать то что вам надо.

И еще!!! Linux - это НЕ ОС реального времени!!! и об уверенных таймеровках менее 10мс можете забыть, если только не хотите считать тики процессора в цикле руками...
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Таймер в Linux

Сообщение deninok »


Спасибо большое, посмотрю...


(Galaxy Master) писал(а):1. Вы вообще отдаете себе отчет в том, как звучит ваш вопрос для не посвященного в вашу проблему? (что за программа? вы ее пишете или это бинарь без исходников?)
2. Если это какой-то бинарь, то тему можно закрывать.
3. Если это не бинарь, то тему все равно можно закрывать, если только ваша программа не кернельный модуль.
4. Если вы немного поумерите аппетит на счет 1мс, то есть 2 варианта решения:
1. Правильно организовать рабочий цикл программы и узнавая время с помощью clock_gettime() дергать вашу ф-цию.
2. Если ваш рабочий цикл для первого варианта организовать не можете, то создать поток, который будет засыпать nanosleep() и дергать то что вам надо.

И еще!!! Linux - это НЕ ОС реального времени!!! и о таймеровках менее 10мс можете забыть, если только не хотите считать тики процессора в цикле руками...


1. Нет, это не бинарь, программу пишу я.
2. Она не является модулем ядра.
3. Умерить аппетит насчёт 1 мс не могу. Более того, мне может понадобиться в десять раз быстрее, то есть 100 мкс...
Спасибо сказали:
Galaxy Master
Сообщения: 142
ОС: Debian GNU/Linux

Re: Таймер в Linux

Сообщение Galaxy Master »

deninok писал(а):
07.06.2008 23:11
1. Нет, это не бинарь, программу пишу я.
2. Она не является модулем ядра.
3. Умерить аппетит насчёт 1 мс не могу. Более того, мне может понадобиться в десять раз быстрее, то есть 100 мкс...


Такие вещи правильно решать на аппаратном уровне. В виде отдельной платы с микроконтроллером или т.п. железом. В рамках операционки даже не стоит пробовать, если только не планируете взять DOS, прицепиться к прерываниям и... понеслась....
Спасибо сказали:
yaleks
Сообщения: 2121
Статус: вне статуса
ОС: Gentoo ~

Re: Таймер в Linux

Сообщение yaleks »

Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Таймер в Linux

Сообщение Zeus »

deninok
Я делал это в модуле ядра:
Кое-что об устройстве ядра
Спасибо сказали:
ssh
Сообщения: 78
ОС: Debian

Re: Таймер в Linux

Сообщение ssh »

Если требования к таймеру строгие, то даже для миллисекундного интервала необходимо организовывать аппаратный таймер и управлять программой по прерываниям; соответственно, без написания модуля ядра не обойтись. Вот по этому поводу есть хорошая книжка, в интернете встречается: Alessadro Rubini, Jonathan Corbet "Linux Device Drivers".

Что касается аппаратного таймера, то можно сделать кварцованный генератор импульсов и дергать соответствующую ножку параллельного порта (кстати, в упомянутой книжке работа с ним хорошо объяснена). Реально можно организовать стабильные временные интервалы до 5-10 мкс.
Спасибо сказали:
yaleks
Сообщения: 2121
Статус: вне статуса
ОС: Gentoo ~

Re: Таймер в Linux

Сообщение yaleks »

ssh писал(а):
08.06.2008 08:07
Что касается аппаратного таймера, то можно сделать кварцованный генератор импульсов и дергать соответствующую ножку параллельного порта (кстати, в упомянутой книжке работа с ним хорошо объяснена). Реально можно организовать стабильные временные интервалы до 5-10 мкс.

А как же HPET на почти всех материнках за последние 5 лет?
( http://en.wikipedia.org/wiki/High_Precision_Event_Timer) писал(а):An HPET block consists of a fixed-rate up-counter and 3 to 32 independent timers, each of which consists of a comparator and a register for storing a trigger value. There can be at most 8 HPET blocks. Each comparator can generate an interrupt when the counter reaches a pre-programmed value.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Таймер в Linux

Сообщение RasenHerz »

1. Вы вообще отдаете себе отчет в том, как звучит ваш вопрос для не посвященного в вашу проблему? (что за программа? вы ее пишете или это бинарь без исходников?)
2. Если это какой-то бинарь, то тему можно закрывать.
3. Если это не бинарь, то тему все равно можно закрывать, если только ваша программа не кернельный модуль.
4. Если вы немного поумерите аппетит на счет 1мс, то есть 2 варианта решения:
1. Правильно организовать рабочий цикл программы и узнавая время с помощью clock_gettime() дергать вашу ф-цию.
2. Если ваш рабочий цикл для первого варианта организовать не можете, то создать поток, который будет засыпать nanosleep() и дергать то что вам надо.

И еще!!! Linux - это НЕ ОС реального времени!!! и об уверенных таймеровках менее 10мс можете забыть, если только не хотите считать тики процессора в цикле руками...


1.Мне понятно.
2.Ерунда, сообщество СПО на то и свободное, что с программами можно делать что угодно (кроме случаев, оговоренных лицензией GPL)
3.Что мешает написать модуль взаимодействующий с user-space? ничто.
4. -

От себя добавлю - действительно книга "Linux Device Drivers", очень поможет вам в разработке этой программы, жаль что она на английском (правда где-то на проторах Интернета я видел частичный ее перевод)
Спасибо сказали:
Galaxy Master
Сообщения: 142
ОС: Debian GNU/Linux

Re: Таймер в Linux

Сообщение Galaxy Master »

RasenHerz писал(а):
08.06.2008 15:01
2.Ерунда, сообщество СПО на то и свободное, что с программами можно делать что угодно (кроме случаев, оговоренных лицензией GPL)
3.Что мешает написать модуль взаимодействующий с user-space? ничто.


Прочитав все посты это понятно, а вот если прочесть только первый пост, то нет. И в нем нет ни одного упоминания о том, что это за программа. Ни одного упоминания что она свободная/не свободная... вообще ничего...
Кроме того связываться с ядром автор видимо тоже не собирается... А из юзер-спейса ловить микросекунды... это просто смешно.

Всякие мутные книги по ядру это, конечно, очень хорошо и познавательно, НО...!!!
Если задача серьезная, то решать такое надо ТОЛЬКО на аппаратном уровне, а с PC только контролировать. И таймеровки осциллографом мерять.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Таймер в Linux

Сообщение deninok »

Спасибо за ваши ответы и ссылки! Обязательно посмотрю и изучу!
Спасибо сказали: