Таймер разрешения 1 мс под Linux рекомендуется - PullRequest
18 голосов
/ 27 октября 2008

Мне нужен таймер с разрешением 1 мс под Linux. Он используется для увеличения значения таймера, которое, в свою очередь, используется для определения необходимости запуска различных событий. POSIX timerfd_create не является опцией из-за требования glibc. Я пробовал timer_create и timer_settimer, но лучшее, что я получаю от них, - это разрешение 10 мс, меньшие значения, по-видимому, по умолчанию имеют разрешение 10 мс. Getittimer и setitimer имеют разрешение 10 мс в соответствии с man-страницей.

Единственный способ сделать этот таймер, о котором я сейчас могу подумать, - это использовать clock_gettime с CLOCK_MONOTONIC в моем основном цикле - тест, если мс прошла, и, если да, увеличить счетчик (и затем проверить, должны ли срабатывать различные События ).

Есть ли лучший способ сделать это, чем постоянно запрашивать в основном цикле? Какое рекомендуемое решение для этого?

Я использую простой старый язык c

Обновление
Я использую ядро ​​2.6.26. Я знаю, что вы можете прерывать его на частоте 1 кГц, а функции POSIX timer_ * затем можно запрограммировать до 1 мс, но это кажется ненадежным, и я не хочу использовать это, потому что для некоторых может потребоваться новое ядро системы. Некоторое стандартное ядро, похоже, все еще настроено на 100 Гц. И я должен был бы обнаружить это. Приложение может быть запущено не на моей Системе:)

Я не могу спать в течение 1 мс, потому что могут быть сетевые события, на которые я должен реагировать.

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

Почему я принял ответ Я думаю, что ответ из freespace лучше всего описывает, почему это невозможно без системы Linux реального времени.

Ответы [ 12 ]

0 голосов
/ 11 января 2013

Вам не нужна ОСРВ для простого приложения реального времени. Все современные процессоры имеют таймеры общего назначения. Получить таблицу данных для любого целевого процессора, с которым вы работаете. Посмотрите в исходном коде ядра, в каталоге arch вы найдете специфичный для процессора источник, как обрабатывать эти таймеры.

Есть два подхода, которые вы можете использовать с этим:

1) Ваше приложение работает только с вашим конечным автоматом, и ничего больше. Linux - это просто ваш «загрузчик». Создайте объект ядра, который устанавливает символьное устройство. При вставке в ядро ​​настройте GP Timer для непрерывной работы. Вы знаете частоту, на которой он работает. Теперь в ядре явно отключите ваш сторожевой таймер. Теперь отключите прерывания (аппаратное и программное обеспечение). В ядре Linux с одним процессором вызов spin_lock () сделает это (никогда не отпускает его). Процессор - ВАШ. Занят цикл, проверяя значение GPT до тех пор, пока не пройдет необходимое количество тактов, когда они установятся, установите значение для следующего тайм-аута и введите свой цикл обработки. Просто убедитесь, что время пакета для вашего кода меньше 1 мс

2) 2-й вариант. Это предполагает, что вы используете приоритетное ядро ​​Linux. Установите неиспользованный GPT рядом с вашей работающей ОС. Теперь установите прерывание для запуска некоторого настраиваемого поля ДО того, как произойдет тайм-аут в 1 мс (скажем, 50-75 мксек). Когда сработает прерывание, вы немедленно отключите прерывания и ожидаете вращения в течение 1 мс, затем войдите в конечный автомат и затем Включение прерываний на вашем ожидании. Это объясняет тот факт, что вы сотрудничаете с ДРУГИМИ вещами в ядре, которые отключают прерывания. Это предполагает, что нет никаких других действий ядра, которые блокируют прерывания на длительное время (более 100 мкс.). Теперь вы можете ИЗМЕРИТЬ точность вашего события обстрела и увеличивать окно до тех пор, пока оно не будет соответствовать вашим потребностям.

Если вместо этого вы пытаетесь узнать, как работает RTOS ... или если вы пытаетесь решить проблему управления с более чем одной ответственностью в реальном времени ... тогда используйте RTOS.

0 голосов
/ 27 октября 2008

Можете ли вы хотя бы использовать nanosleep в вашей петле, чтобы спать в течение 1 мс? Или это мрачная вещь?

Обновление: Не берите в голову, я вижу на странице руководства "это может занять до 10 мс дольше, чем указано, пока процесс не станет снова работоспособным"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...