хотите убедиться, что запись tty отправляется на аппаратное обеспечение (UART) с заданной отметкой времени или происходит сбой - PullRequest
0 голосов
/ 08 апреля 2011

Мне нужно записать некоторые данные в последовательный порт, при этом гарантируя, что, если они не могут быть записаны данной «отметкой времени истечения», они вернут код ошибки. Данные поступают с другого последовательного порта, а время истечения - с третьего устройства.

Мой первоначальный план состоял в том, чтобы реализовать все это в пространстве ядра, но я пришел к выводу, что, поскольку ему нужен доступ к 3 устройствам, вероятно, было бы лучше соединить их в пространстве пользователя; к сожалению, это затрудняет выбор времени.

Несмотря на то, что я потратил много времени на чтение LDD3 и просмотр подсистемы tty и связанного с ней кода, у меня возникли проблемы при разработке, как этого добиться. Я действительно хочу добавить функциональность к существующему последовательному порту / tty устройству, чтобы я мог использовать ioctl или написать escape-последовательность, указывающую данные и время истечения.

У меня есть контроль над источником ядра, хотя он уже распространен, если я смогу достичь этого исключительно с помощью модуля ядра, который был бы превосходным. Если необходимо обновить ядро, пусть будет так.

Может ли кто-нибудь предоставить либо руководство по добавлению этой истекающей записи в существующую комбинацию последовательный / tty, либо другой совет о том, что может быть лучше для этого?

Заранее спасибо - извиняюсь, если недостаточно информации, я добавлю детали, если они требуются.

1 Ответ

4 голосов
/ 11 апреля 2011

Я предлагаю сделать это полностью в пространстве пользователя. За этим стоит два предположения: у вас нет управления потоком, а требуемая точность составляет около 50 мс или хуже.

Отсутствие управления потоком является существенным: аппаратное управление потоком может позволить враждебному удаленному устройству обмануть вас, блокируя байты в UART FIFO. Программное управление потоком данных может заблокировать данные в драйвере устройства. При этом данные будут передаваться через UART с необходимой скоростью передачи данных без задержки. Если вы убедитесь, что буферы ядра пусты перед каждой записью на устройство, вы добьетесь своего времени.

Части моего решения:

  1. Запустите приложение, используя SCHED_FIFO, чтобы избежать упреждения.
  2. Выберите сообщение для отправки. Вы не говорите, есть ли ограничение на порядок в ваших сообщениях. Если нет, вы можете реализовать планировщик для определения порядка сообщений. Самый ранний срок в первую очередь, вероятно, сработает.
  3. Всегда tcdrain перед записью.
  4. Как только вы узнаете, что выходной буфер пуст, проверьте, достаточно ли времени для прохождения всех байтов с выбранной скоростью передачи. Если оставшегося времени недостаточно, введите код ошибки и вернитесь наверх.
  5. Написать сообщение в байтах.

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

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

...