В нашем оборудовании мы используем WirenBoard - управляем шаговыми двигателями через драйверы с RS485 по Modbus. Но, есть также потребность использовать и другие драйверы, управляемые по STEP/DIR. Для этого нужен высокоточный дискретный сигнал частотой до 10 кГц.
Соответственно, я хочу попробовать использовать один из выходов A для управления таким драйвером шагового двигателя.
Собственно, я это уже реализовал с помощью пакета на C, с таймером.
Но тут возникла проблема - не совсем идеальная, нестабильная работа двигателя, очевидно таймер срабатывает через разные промежутки времени. Пробовал повышать приоритет процесса через sched_setscheduler(), это помогает но всё равно есть нестабильность.
Вы не подскажете, может быть есть какой-то путь решения?
Например, изолировать одно из ядер CPU и использовать его только под мой пакет.
Дергать GPIO из линукса с такой частотой — не лучшая идея. Всё-таки он не предназначен для таких задач. Как правило для решения данной проблемы используют внешний контроллер, который уже сам формирует сигналы. Вот, например, первое что попалось в гугле — Контроллер Modbus для шагового двигателя и энкодера. Контроллер управляется по протоколу MODBUS-RTU через интерфейс RS-485. Чтобы подключить к контроллеру Wiren Board — нужно написать шаблон.
К сожалению, использование такого устройства не имеет практического смысла, в таком случае, надёжнее (и дешевле) будет драйвер шагового двигателя с уже встроенным интерфейсом RS-485.
Мой вопрос касался именно прямого подключения.
При подключении напрямую вряд ли получится такое сделать. Где-то находил библиотеку, реализующую управление GPIO через память процессора, с ней управлять получится быстрее, но даже в таком случае высокой точности не добиться. Проще и надежнее использовать внешний контроллер. Если стоимость готовых решений не устраивает — можно сделать самому на той же ардуино.
Дальше инициализировать этот шим-интерфейс его через device tree.
юзерспейс и изоляция ядер - это taskset для процесса.
Есть ещё cpuset, чтобы раскидать разные процессы по разным ядрам. Там довольно сложный интерфейс, провозиться можно долго.
Есть параметр ядра isolcpus, но он устаревший.
В любом случае, это довольно много приключений. Из коробки мы такую возможность не заявляем, поэтому помочь на этом пути сможем только советом в свободное время.
Да, конечно, я это понимаю, поэтому, ни в коем случае, не требую готовое решение и не заявляю никаких претензий.
Я и сам занимаюсь этим вопросом в свободное от основных проектов время.
Спасибо за советы, попробую.