Мне нужно рассчитать разницу во времени между высоким -> низким и низким -> высоким фронтом сигнала на выводах GPIO. Я написал простую программу, которая делает это. После того, как я пробежался некоторое время, я был вполне доволен результатом (вариации 0,01 с). Но время от времени возникала ошибка 0,5 с. Я думал, что это может быть связано с каким-то другим системным процессом, запущенным в то время. Итак, мой вопрос:
Могу ли я зарезервировать одно процессорное ядро только для моей программы и разрешить другие 3 ядра для системы?
Я использую Raspbian Jessie Lite, поэтому думаю, что для его запуска будет достаточно 3 ядер.
operating-systems
process
NonStandardModel
источник
источник
Ответы:
Выделение ядра, вероятно, излишне.
Я предлагаю вам попробовать мою библиотеку pigpio . По умолчанию время GPIO изменяется в пределах 10 мкс.
В качестве быстрого теста я предлагаю вам взглянуть на этот пример Python , который напечатает любой переход уровня GPIO и время в микросекундах с момента последнего перехода на этом GPIO.
pigpio не устанавливается по умолчанию в Jessie Lite. Либо установите последнюю версию со ссылочного сайта, либо установите более старую версию в репозитории.
sudo apt-get install pigpio python-pigpio python3-pigpio
источник
Вы можете привязать свою программу к одному ядру, используя,
schedutils
как описано в этой статье о Cyberciti :Другие процессы все еще могут быть запланированы на том же ядре, хотя. Итак, второе, что нужно сделать, это убедиться, что ваша команда выполняется с наивысшим приоритетом, используя команду nice (это скажет ядру Linux, что другие процессы должны быть прерваны при необходимости). Запустите вашу программу следующим образом:
Есть и другие возможные причины проблем с синхронизацией. Это не так просто сделать:
Есть способы сделать ваш процесс в реальном времени , а это значит, что он будет работать с определенными временными гарантиями. Проблема в том, что все остальное может быть медленнее, и это сложная тема. Если вы хотите пройти через эту кроличью нору, я предлагаю вам начать изучать процессы в реальном времени в Linux .
источник
Поскольку у вас есть временные требования, Raspberry Pi больше не является подходящей платформой для этого. Это не платформа реального времени, и время может быть выброшено множеством различных источников помех.
Вместо этого вы должны использовать микроконтроллер для измерения этого времени, желательно с использованием прерываний, и передать информацию Пи позже.
источник
Согласно вашему требованию, я не думаю, что вам нужно использовать одноядерный процессор. Вам нужно убедиться, что ваша программа работает постоянно. Чтобы достичь этого, вы можете установить приоритет своей программы очень высоким, чтобы он не мешал никакому другому процессу.
Насколько я знаю ОС (ОС общего назначения), которую мы используем, не предназначены для использования в системах реального времени, поэтому, если вы хотите запустить свой процесс в режиме реального времени, чтобы никакой другой процесс не мешал ему, вам нужно идти для ОС реального времени (ОСРВ). Может быть, они придумают основной выбор. :)
источник