Вопрос по kernel, c, linux – Программирование в реальном времени с Linux

2

Я только что собрал и настроил ванильное ядро Linux с примененным исправлением RT. Все прошло нормально, и теперь я могу корректно загрузиться в новом ядре.

Меня удивляет следующее: у меня есть программа-симулятор, которую я создал на C, и я хочу, чтобы она выполнялась в жестком режиме реального времени, что должно быть разрешено новым ядром. Вероятно, весь симулятор не нужно запускать с приоритетом в реальном времени, но некоторые задачи внутри него выполняются.

Как я могу сделать это? Я полагаю, что просто запустить программу не получится.

Ваш Ответ

1   ответ
7

как запустить некоторые потоки в контексте реального времени, а другие - как обычные потоки с разделением времени, то все, что вам нужно, это установить ихпланировщики правильно с помощьюsched_setscheduler.

Темы с разделением времени хотят бытьSCHED_OTHER; темы симулятора в реальном времени хотят бытьSCHED_FIFO или жеSCHED_RR.

В Linux, чтобы работать в приоритетах реального времени, ваш пользователь должен иметь ограничения ресурсов (человек 2 rlimit) это позволяет. В частности, вашrtprio Для rlimit должен быть установлен самый высокий приоритет, который вам потребуется. Кроме того, вы можете запустить приложение от имени пользователя root. В системе Linux с PAM это обычно достигается добавлением соответствующей строки в/etc/security/limits.conf

    @realtime   -  rtprio     99

Это предоставит rtprio ограничения до приоритета 99 в реальном времениrealtime группа. Затем вы добавляете группу в реальном времени/etc/groups и убедитесь, что ваш пользователь находится в группе.

(И поскольку это, по-видимому, вы делаете в первый раз, вам также может понадобиться высокоприоритетная нить в реальном времени «переключатель мертвеца», чтобы убедиться, что ваш симулятор не выходит из-под контроля и сделать систему непригодной для использования ... если вы имитируете высокую нагрузку на процессор, вы можете получить НАСТОЯЩУЮ высокую нагрузку на процессор и не сможете остановить работу без перезагрузки.)

Возможно, у вас нет прав для вызова set_scheduler. Вы работаете от имени root? Если это исправит это, то Правильно будет создать группу, которой разрешено делать вещи в реальном времени, и поместить это в ваш файл limit.conf. Быстрый пример здесь:jackaudio.org/linux_rt_config
так скажем, я вызвал во вновь разветвленном процессе эту команду: sched_setscheduler (getpid (), SCHED_FIFO, & amp; sp); почему это не выполняется правильно? sched_setscheduler возвращает 1 вместо 0, и я уверен, что sp настроен правильно (sp.sched_priority установлен в 98) Lawrence Ironjuly
Путь кlimits.conf на Ubuntu 16.04 есть/etc/security/limits.conf(обратите внимание на добавленныйsecurity каталог)manpages.ubuntu.com/manpages/trusty/man5/limits.conf.5.html
Разве Alt + SysRq + N не должен перевести все процессы реального времени в нормальный режим?
@Victor: я раньше не использовал эту функцию и не знаю, на что можно положиться. Похоже, что он использовался для того, чтобы все ренить и отбрасывать все приоритеты, но не представляю, как вы после этого вернетесь к чему-то похожему на нормальное состояние приоритета.

Похожие вопросы