Доброго всем времени суток!
Итак, проблема. Есть Линуксовый компьютер, на котором запускается некая программа, и этой программе необходим особый "программный таймерный механизм". Суть этого механизма в том, что он (будучи один раз запущенным на стадии инициализации программы) должен через каждую, например, 1 миллисекунду прерывать ход программы и инициировать определённое действие (например, вызывать некоторую функцию). Иными словами, данный "таймерный механизм" должен предоставлять программе, скажем так, "миллисекундные часы".
Вопрос: как в Linux реализовать подобного рода "программный таймерный механизм"?
Заранее благодарен за ответы.
Таймер в Linux (Программные миллисекундные часы)
Модератор: Модераторы разделов
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
-
Galaxy Master
- Сообщения: 142
- ОС: Debian GNU/Linux
Re: Таймер в Linux
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
(d_n_k) писал(а):http://linux.die.net/man/2/setitimer
Спасибо большое, посмотрю...
(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
Такие вещи правильно решать на аппаратном уровне. В виде отдельной платы с микроконтроллером или т.п. железом. В рамках операционки даже не стоит пробовать, если только не планируете взять DOS, прицепиться к прерываниям и... понеслась....
-
yaleks
- Сообщения: 2121
- Статус: вне статуса
- ОС: Gentoo ~
-
Zeus
- Сообщения: 694
-
ssh
- Сообщения: 78
- ОС: Debian
Re: Таймер в Linux
Если требования к таймеру строгие, то даже для миллисекундного интервала необходимо организовывать аппаратный таймер и управлять программой по прерываниям; соответственно, без написания модуля ядра не обойтись. Вот по этому поводу есть хорошая книжка, в интернете встречается: Alessadro Rubini, Jonathan Corbet "Linux Device Drivers".
Что касается аппаратного таймера, то можно сделать кварцованный генератор импульсов и дергать соответствующую ножку параллельного порта (кстати, в упомянутой книжке работа с ним хорошо объяснена). Реально можно организовать стабильные временные интервалы до 5-10 мкс.
Что касается аппаратного таймера, то можно сделать кварцованный генератор импульсов и дергать соответствующую ножку параллельного порта (кстати, в упомянутой книжке работа с ним хорошо объяснена). Реально можно организовать стабильные временные интервалы до 5-10 мкс.
-
yaleks
- Сообщения: 2121
- Статус: вне статуса
- ОС: Gentoo ~
Re: Таймер в Linux
А как же 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
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
Прочитав все посты это понятно, а вот если прочесть только первый пост, то нет. И в нем нет ни одного упоминания о том, что это за программа. Ни одного упоминания что она свободная/не свободная... вообще ничего...
Кроме того связываться с ядром автор видимо тоже не собирается... А из юзер-спейса ловить микросекунды... это просто смешно.
Всякие мутные книги по ядру это, конечно, очень хорошо и познавательно, НО...!!!
Если задача серьезная, то решать такое надо ТОЛЬКО на аппаратном уровне, а с PC только контролировать. И таймеровки осциллографом мерять.
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Таймер в Linux
Спасибо за ваши ответы и ссылки! Обязательно посмотрю и изучу!