|
Как зафиксировать время получения прерывания?, RS232/LPT/etc |
|
|
|
Sep 18 2011, 14:27
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 5-07-10
Пользователь №: 58 297

|
Доброго времени суток! Предположим - есть ПО на персоналке под управлением распространенной десктопной ОС - Windows/Ubuntu/other-desktop-linux/etc. ПО занимается просчетом некоторой модели и отрисовкой объектов (примитивов) на мониторе (более подробно тут - http://electronix.ru/forum/index.php?showtopic=94410)К персоналке подключен внешний контроллер-пульт с кнопкой - подключить можно по RS232, LPT или другому интерфейсу с постоянными/прогнозируемыми задержками (USB не подойдет, так как задержка не детерминирована). На персоналке нужно получить максимально точно время получения прерывания - даже сам факт прерывания от контроллера, а не содержание полученных данных. В прошлой теме выяснил для себя, что между первичной обработкой прерывания драйвером и передачей управления прикладному процессу, который бы это прерывание обработал, может пройти ВЕЧНОСТЬ (десятки миллисекунд, или ~10 мс при использовании ОСРВ). При этом драйверу для первичной обработки управление будет передано через интервал времени порядка микросекунд после получения. Отсюда вопросы: 1) Как в Windows/Linux переопределить первичную обработку аппаратного прерывания? (И куда временно положить захваченное время, чтобы потом передать его прикладному процессу?) 2) Есть ли в Windows/Linux УЖЕ механизм, который фиксирует время получения аппаратных прерываний? И как его "интерфейсить" из ПО? 3) Какой физический интерфейс лучше подойдет? Заранее благодарен!
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Sep 20 2011, 08:05
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
В Linux нет приоритетной системы прерываний- одной из отличительных особенностей RTOS. Завесить в своём драйвере (или модифицируя исходный код драйвера RS232) обработчик прерывания легко. Управление обработчик прерываний гарантированно получит, сразу же при отсутсвии в системе одновременно с ним других аппаратных прерываний. Также в критических участках кода ядра ОС или драйверов, могут временно полностью запрещаться рперывания на несколько микросекунд. Приложение пользователя даже с наибольшим приоритетом получит упраление через шаг планировщика (scheduler) ядра ОС Linux. Временной шаг планировщика задаётся при настройке до последующей сборки ядра Linux kernel. И может быть изменен только пере- сборкой ядра. /boot/.config-2.6.32-5-686 В debian 6 это : # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 Если не использоватьRTOS, возможно применить Linux Real Time Application Interface: Например: http://packages.debian.org/sid/rtai
|
|
|
|
Guest_@Ark_*
|
Sep 20 2011, 08:33
|
Guests

|
Одно из возможных решений - использовать так называемые "временные метки". То есть фиксировать время интересующего события непосредственно в самом внешнем устройстве, по собственному таймеру (часам). Далее, включать это время, в качестве атрибута, в пакет передаваемых данных на PC. Задержки при передаче, конечно, ни куда не исчезнут. И их неопределенность останется. Но, по крайней мере, при обработке данных в своей прикладной программе Вы будете знать точную хронологию событий. P.S. В этом случае, можно использовать и USB-канал.
Сообщение отредактировал @Ark - Sep 20 2011, 08:34
|
|
|
|
|
Sep 20 2011, 20:54
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 5-07-10
Пользователь №: 58 297

|
gosha, sasamyА расскажите, пожалуйста, как завесить имеющееся аппаратное прерывание своим? Делал раньше такие штуки только на asm'е под DOS, там просто добавлялся обработчик для int 14h, но здесь я так понимаю совершенно другой уровень абстракции. В идеале - мне бы сразу по получению запомнить текущий тик от системных часов, а дальше отдать управление в дефолтный хандлер. (Неужели никто не догадался при разработке драйвера это время запоминать?) kurtisСпасибо за много умных слов, пойду кормить гугл всемЯ же правильно понимаю, RTOS поможет только для планирования прикладного процесса (-ов), а на аппаратные прерывания никак не повлияет? @ArkЯ тоже думаю об этом варианте, но тогда действительно есть узкое место - синхронизация контроллера и ПК с заданной точностью. В прошлой теме предложили 1PPS или фотодиод, который прикреплен в угол экрана и ждет управляющего символа - начала движения объекта. Тогда вроде бы и лаг ЖК-монитора можно убрать из цепочки задержек, но что-то меня в этом подходе настораживает.
|
|
|
|
Guest_@Ark_*
|
Sep 20 2011, 21:30
|
Guests

|
Цитата ... есть узкое место - синхронизация контроллера и ПК с заданной точностью Не нужно ничего синхронизировать. Просто, фиксируете все времена, исключительно, по таймеру внешнего устройства. Это должно относиться и к нажатиям на кнопки, и к сигналам срабатывания фотодиода. Снабжаете эти события временными метками и передаете все в ПК. Ведь вас интересуют только относительные времена между событиями. Как соотносятся временные системы отсчета таймера внешнего устройства и вашего ПК - при таком подходе совершенно не имеет значения.
|
|
|
|
|
Sep 20 2011, 21:39
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 5-07-10
Пользователь №: 58 297

|
Цитата(@Ark @ Sep 21 2011, 01:30)  Не нужно ничего синхронизировать. Просто, фиксируете все времена, исключительно, по таймеру внешнего устройства. Это должно относиться и к нажатиям на кнопки, и к сигналам срабатывания фотодиода. Снабжаете эти события временными метками и передаете все в ПК. Ведь вас интересуют только относительные времена между событиями. Как соотносятся временные системы отсчета таймера внешнего устройства и вашего ПК - при таком подходе совершенно не имеет значения. может быть и так. обдумаю, спасибо. пока хочется просчитать вариант с "глупым" контроллером и всей обработкой на ПК
|
|
|
|
|
Sep 21 2011, 04:57
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
QUOTE (Andrey Pesoshin @ Sep 21 2011, 00:54)  А расскажите, пожалуйста, как завесить имеющееся аппаратное прерывание своим? Делал раньше такие штуки только на asm'е под DOS, там просто добавлялся обработчик для int 14h, но здесь я так понимаю совершенно другой уровень абстракции. В идеале - мне бы сразу по получению запомнить текущий тик от системных часов, а дальше отдать управление в дефолтный хандлер. (Неужели никто не догадался при разработке драйвера это время запоминать?) http://www.opennet.ru/man.shtml?topic=requ...9&russian=2По замеру времени, выше предложили типовой вариант: внешнее событие подаём на один луч осциллографа. В обработчике прерывания выводим, например на LPT, логическую "1". Сигнал с LPT подаём на другой луч осциллографа. Смотрим разность по времени импульсов. Двух лучевой осциллограф рулит.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|