Фон:
У меня есть карта PCI, которая в основном представляет собой часы. Он получает время по GPS и сохраняет текущее время в определенном регистре.
Цель:
Я хочу снова и снова считывать ограниченное количество регистров / байтов (например, текущее время) с минимально возможной задержкой. (Часы обеспечивают очень высокую точность, и я думаю, что потеряю точность, чем выше будет задержка.) Операционная система - RedHat. Язык программирования - C / C ++. Я также хочу записывать в память устройства, поэтому задержка не является проблемой.
Возможные пути:
Я вижу эти пути. Если вы увидите другой, скажите, пожалуйста:
- Написание драйвера модуля ядра Linux, который создает символьное устройство (или одно символьное устройство для чтения каждого регистра). Затем приложение пользовательского пространства может выполнить «чтение» файлов / dev /.
- DMA
- mmap файл sysfs resourceX в пользовательское пространство приложением пользовательского пространства (системный вызов). (например, здесь)
- Напишите драйвер модуля ядра Linux, который реализует операцию с файлом mmap.
Вопросов:
- Каким образом достигается наименьшая задержка при фактическом чтении регистра? Я знаю, что mmap вызывает много накладных расходов в ядре, но насколько я понимаю, это только для инициализации.
- Является ли путь 3 законным? Для меня это похоже на взлом. Как я могу автоматически определить путь / sys / из приложения?
- Есть ли разница между путями 3 и 4? Я новичок в программировании драйверов PCI и думаю, что не совсем понимал, как работает способ 4. Я прочитал это (и другие главы эту книгу), но, может быть, вы дадите мне подсказку или пример. Я был бы признателен, что.
gettimeofday()
. Если ваш драйвер часов может обновлять переменную внутри VDSO, это будет самый быстрый способ. - person 0andriy   schedule 19.07.2018