Программирование в реальном времени с Linux
Я только что собрал и настроил ванильное ядро Linux с примененным исправлением RT. Все прошло нормально, и теперь я могу корректно загрузиться в новом ядре.
Меня удивляет следующее: у меня есть программа-симулятор, созданная на C, и я хочу, чтобы она выполнялась в режиме реального времени, что должно быть разрешено новым ядром. Вероятно, весь симулятор не нужно запускать с приоритетом в реальном времени, но некоторые задачи внутри него выполняются.
Как я могу сделать это? Я так понимаю, что просто запустить программу не получится.
1 ответ
Если вы спрашиваете, как запустить некоторые потоки в контексте реального времени, а другие - как обычные потоки с разделением времени, то все, что вам нужно, это правильно настроить их планировщики, используя sched_setscheduler
,
Темы с разделением времени хотят быть SCHED_OTHER
; темы симулятора в реальном времени хотят быть SCHED_FIFO
или же SCHED_RR
,
В Linux, чтобы работать с приоритетами в реальном времени, ваш пользователь должен иметь ограничения ресурсов ( man 2 rlimit), которые позволяют это. В частности, ваш rtprio
Для rlimit должен быть установлен самый высокий приоритет, который вам потребуется. Кроме того, вы можете запустить приложение от имени пользователя root. В системе Linux с PAM это обычно достигается добавлением соответствующей строки в /etc/security/limits.conf
@realtime - rtprio 99
Это предоставит rtprio ограничения до приоритета 99 в реальном времени для группы в реальном времени. Затем вы добавляете группу в реальном времени /etc/groups
и убедитесь, что ваш пользователь находится в группе.
(И поскольку это, по-видимому, вы делаете в первый раз, вам также может понадобиться высокоприоритетная нить в реальном времени "Переключатель мертвеца", чтобы убедиться, что ваш симулятор не выходит из-под контроля и отображает систему. непригодный для использования... если вы имитируете высокую нагрузку на процессор, вы можете получить НАСТОЯЩУЮ высокую нагрузку на процессор и не сможете остановить работу без перезагрузки.)