LinuxCNC + realtime LPT
Добавлено: 14 окт 2019, 15:24
Привет, я у вас новенький.
Почитал я про LinuxCNC - все мучаются с таймингами, пробуют RTAI, RT PREEMT, но все-равно результаты оставляют желать лучшего.
Если посмотреть как решается проблема в уже существующих устройствах, критичных ко времени, то можно заметить примерно один и тот же подход: генерация данных происходит достаточно большими пачками, буферы отправляются во внутреннюю память устройства, само устройство берет данные из внутреннего буфера. (Подобным образом, например, работает звуковая карта).
Если попробовать данный подход применить к управлению станком, то должно выглядеть примерно так: LinuxCNC генерирует управляющую последовательность состоящую из команд управления и задержек, буферезирует, и отправляет в некое устройство вывода, которое способно обеспечить нужные тайминги.
Самый простой и распространенный вариант устройства вывода - LPT порт. Нужные тайминги можно обеспечить путем использования потока ядра (kernel) выполняющегося на изолированном ядре (core). Управляющая последовательность состоит из 2х команд:
а) задержка (timeout);
б) состояние выходов LPT порта.
Реализовать команды можно как 32bit числа. Если старший бит == 1, то оставшиеся 31 бит интерпретируются как timeout, иначе данные выводятся в LPT порт. Модуль ядра имеет внутренний буфер (например, кольцевой) и вычитывает управляющую последовательность из него. Общение с модулем происходит через псевдоустройство, поддерживающее запись данных в буфер, и минимальные управляющие команды
Такой подход подойдет для любых систем имеющих несколько ядер (core) любого ядра linux (kernel) поддерживающего isolcpus (доступно даже на 2.6 ядрах). Модуль ядра должен быть достаточно прост и подходить для любой версии ядра.
Кажется, что все просто и легко, и потому не понятно, что именно я не учел, почему так не сделано? Всем спасибо.
Почитал я про LinuxCNC - все мучаются с таймингами, пробуют RTAI, RT PREEMT, но все-равно результаты оставляют желать лучшего.
Если посмотреть как решается проблема в уже существующих устройствах, критичных ко времени, то можно заметить примерно один и тот же подход: генерация данных происходит достаточно большими пачками, буферы отправляются во внутреннюю память устройства, само устройство берет данные из внутреннего буфера. (Подобным образом, например, работает звуковая карта).
Если попробовать данный подход применить к управлению станком, то должно выглядеть примерно так: LinuxCNC генерирует управляющую последовательность состоящую из команд управления и задержек, буферезирует, и отправляет в некое устройство вывода, которое способно обеспечить нужные тайминги.
Самый простой и распространенный вариант устройства вывода - LPT порт. Нужные тайминги можно обеспечить путем использования потока ядра (kernel) выполняющегося на изолированном ядре (core). Управляющая последовательность состоит из 2х команд:
а) задержка (timeout);
б) состояние выходов LPT порта.
Реализовать команды можно как 32bit числа. Если старший бит == 1, то оставшиеся 31 бит интерпретируются как timeout, иначе данные выводятся в LPT порт. Модуль ядра имеет внутренний буфер (например, кольцевой) и вычитывает управляющую последовательность из него. Общение с модулем происходит через псевдоустройство, поддерживающее запись данных в буфер, и минимальные управляющие команды
Такой подход подойдет для любых систем имеющих несколько ядер (core) любого ядра linux (kernel) поддерживающего isolcpus (доступно даже на 2.6 ядрах). Модуль ядра должен быть достаточно прост и подходить для любой версии ядра.
Кажется, что все просто и легко, и потому не понятно, что именно я не учел, почему так не сделано? Всем спасибо.