реклама на сайте
подробности

 
 
> Прецизионный таймер в Linux, Нужен таймер менее 10mS
vzn
сообщение Apr 6 2006, 08:39
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 32
Регистрация: 1-07-05
Пользователь №: 6 454



Добрый день.
Подскажите как в Linux можно реализовать посылку сигнала SIGALRM в мое приложение с периодом
порядка 100us(микросекунд).

Настройка обычного таймера в Linux согласно man предполагает минимальный период 10 ms.

Вариант с перекомпиляцией ядра для уменьшения времени отклика не подходит.

Какие еще могут быть способы реализовать таймер?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Harbour
сообщение Apr 7 2006, 08:53
Сообщение #2


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



Да ну ? Есть такая фигня как гарантированный deadline - запутят на той non-rt оси какой-нить низкоприоритетный процесс, который заюзает ram+swap на 100% - и скажем bye-bye этому "realtim'у", пусть даже секундному и никакие posix расширения не спасут.
Go to the top of the page
 
+Quote Post
Olej
сообщение Apr 7 2006, 09:49
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(Harbour @ Apr 7 2006, 11:53) *
Да ну ?


http://qnxclub.net/files/articles/RemarksO...TheMargins.html

smile.gif
Go to the top of the page
 
+Quote Post
vzn
сообщение Apr 7 2006, 10:22
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 32
Регистрация: 1-07-05
Пользователь №: 6 454



Спасибо всем за дельные советы.

Пока я остановился на следующем решении основаном на использовании rdtscl()(#include <asm/msr.h>). Оно конечно не оптимальное, но для моих условий пока подходит.

Привязал исполнение моей real-time задачи не к SIGALRM, а к счетчику тактов процессора.
То есть задача должна выполнятся например каждые 100us.
Для этого оцениваем, сколько тактов нашего процессора в этих 100us. Часть тактов выполняем задачу (задача выполняется менее чем за 100us) часть тактов ждем ничего не делая, пока не на тикает оставшееся количество тактов. Все в обычном цикле.

При исполнении только моего приложения и ничего кроме него, решение дает приемлемый результат по точности. Если исполняется еще что-либо, то происходят сбои.
Go to the top of the page
 
+Quote Post
Olej
сообщение Apr 7 2006, 10:44
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(vzn @ Apr 7 2006, 13:22) *
Пока я остановился на следующем решении основаном на использовании rdtscl()(#include <asm/msr.h>). Оно конечно не оптимальное, но для моих условий пока подходит.

Привязал исполнение моей real-time задачи не к SIGALRM, а к счетчику тактов процессора.
То есть задача должна выполнятся например каждые 100us.
Для этого оцениваем, сколько тактов нашего процессора в этих 100us. Часть тактов выполняем задачу (задача выполняется менее чем за 100us) часть тактов ждем ничего не делая, пока не на тикает оставшееся количество тактов. Все в обычном цикле.

При исполнении только моего приложения и ничего кроме него, решение дает приемлемый результат по точности. Если исполняется еще что-либо, то происходят сбои.


Вы то же самое могли бы сделать и по схеме с сигналами или любым другим асинхронным уведомлением (это и проще по коду, и точнее будет - затраты на вычисления уйдут из цикла активного ожидания):
- запускаете пустой цикл с rdtscl() (это на самом деле 1 команда RDTSC на x86)...
- и как только счётчик перевалит через заранее фиксированное значение - kill() самому себе ... SIGUSR1 или SIGRTMIN ...
- а в обработчике сигнала - запуск своей кратковременной задачи.
Или, если так больше нравится - всё то же можно выполнить в 2-х потоках.

Цитата(Harbour @ Apr 7 2006, 11:53) *
Есть такая фигня как гарантированный deadline - запутят на той non-rt оси какой-нить низкоприоритетный процесс, который заюзает ram+swap на 100% - и скажем bye-bye этому "realtim'у", пусть даже секундному и никакие posix расширения не спасут.


В общем ... оно и правильно. Но свопирование во всех (нормальных wink.gif : FreeBSD, Linux) OS можно запретить для задачи - это обязательное условие для таких задач... так же как в QNX - оно всегда запрещено (или всегда отсутствует, если кому так больше нравитс wink.gif).
Но вопрос, заданный в этой теме - он не относится к какой-либо OS, он будет возникать везде... даже в уже "некуда далее RT" wink.gif QNX - можно уменьшить шаг системного времени до 10мксек (а минимальный интервал, как я уже говорил, вы принципиально не сделаете меньше 20мксек) - но всегда найдётся кто-то, кому понадобится временной шаг в ... 7 мксек wink.gif. И опять та же история: нельзя разрешить 2 события, временной интервал которых меньше шага системного времени ... независимо RT это OS или не RT.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- vzn   Прецизионный таймер в Linux   Apr 6 2006, 08:39
- - appsoft   Думаю реализовать такой таймер средствами Linux не...   Apr 6 2006, 09:08
- - makc   В ядре Линукса есть определение макроса HZ=100, ко...   Apr 6 2006, 09:08
- - yanich   Цитата(vzn @ Apr 6 2006, 12:39) Добрый де...   Apr 6 2006, 10:07
|- - Olej   Цитата(vzn @ Apr 6 2006, 12:39) Подскажит...   Apr 6 2006, 11:46
- - sensor_ua   Может, поможет http://www.ittc.ku.edu/kurt/   Apr 6 2006, 11:20
- - Olej   Цитата(vzn @ Apr 6 2006, 11:39) Вариант с...   Apr 6 2006, 11:33
- - Harbour   Попытки вытянуть за уши из non-rt реализации rt за...   Apr 6 2006, 19:08
|- - Olej   Цитата(Harbour @ Apr 6 2006, 22:08) Попыт...   Apr 7 2006, 07:21
- - Harbour   Если речь идет о самой критической задаче то вызов...   Apr 7 2006, 11:17
|- - Olej   Цитата(Harbour @ Apr 7 2006, 14:17) В слу...   Apr 7 2006, 11:45
- - Konstantin_SPB   Используйте select(), читайте man select, как это ...   Jun 22 2006, 10:05
|- - Olej   Цитата(Konstantin_SPB @ Jun 22 2006, 13:0...   Jun 22 2006, 10:25
- - Илья Игоревич   Решение есть. Появилось совсем недавно, в виде пат...   Aug 8 2006, 13:41


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 16:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016