Чи можу я мати 1 ядро ​​процесора лише для своєї програми?


12

Я маю час різниця у часі між високим -> низьким і низьким -> високим краєм сигналу на шпильки GPIO. Я написав просту програму, яка це робить. Після деякого запуску його я був цілком задоволений результатом (варіації 0,01 с). Але час від часу виникала помилка 0,5 с. Я думав, що це може бути пов’язано з іншим системним процесом, що працює в той час. Отже, моє питання:

Чи можу я зарезервувати одне ядро ​​процесора лише для своєї програми та дозволити іншим 3 ядра для системи?

Я використовую Raspbian Jessie Lite, тому думаю, що для його запуску буде достатньо 3 ядер.


4
Я припускаю, що ви опитуєте в циклі для статусу шпильки GPIO. Це дуже чутливо до того, як операційна система вирішить виконати вашу програму, яка витратить більшу частину свого часу, затримуючи процесор, не роблячи нічого насправді корисного. Можливо, ви хочете переглянути спосіб встановлення переривання на даному штифті GPIO, який ви можете використовувати, щоб програма спала між краями сигналу на штифтах GPIO.
Флоріан Кастеллан

4
Не впевнені, що ваш проект, але іноді мікроконтролер краще підходить, особливо коли вам потрібна система, яка більше нагадує в реальному часі. Arduino пропонує безліч варіантів, і ви можете написати свою програму на C / C ++.
SnakeDoc

@Florian У RPi.GPIO є функція, схожа на переривання. Він буде блокувати програму, поки не буде виявлено край (джерело: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs ).
NonStandardModel

@SnakeDoc Я знаю, що мікроконтролер краще. Я сподівався цього уникнути, тому що мені не потрібна мікросекундна точність. 1/100 секунди більш ніж достатньо. Також мені потрібен лише час різниці, тож якщо буде затримка, я сподівався, що це буде однаково для запуску та зупинки. Якщо це не працює, я повинен зберігати дані мікроконтролера, підключеного до RPi.
NonStandardModel

1
Або запустити в реальному часі ОС на PI. Проблема у вашому налаштуванні, чи це залежить від "найкращих зусиль" з боку ОС. Залежно від того, що ще відбувається в той же час, коли ваша програма вимагає привілейованого доступу до GPIO, вона може опинитися в черзі за іншими завданнями, які ОС виконує в цей момент. Ви користувальницька програма отримає нижчий пріоритет, ніж системні завдання. Існує також попередження, що означає, що під час виконання вашої програми ОС може бути "призупинено і" відкладено "ОС для запуску іншого процесу, тобто ваші спостереження за часом можуть бути перекошені.
SnakeDoc

Відповіді:


13

Виділення ядра, ймовірно, зайве.

Я пропоную спробувати мою бібліотеку pigpio . За замовчуванням час GPIO змінюється на 10 мкс.

В якості швидкого тесту пропоную вам переглянути цей приклад Python , який буде друкувати будь-який перехід рівня GPIO та час у мікросекундах з моменту останнього переходу на цьому GPIO.

pigpio не встановлений за замовчуванням у Jessie Lite. Або встановіть останню з пов’язаного сайту або встановіть старішу версію в сховищах.

sudo apt-get install pigpio python-pigpio python3-pigpio

pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)

Я спробую вашу бібліотеку pigpio. Зараз я маю закінчити ще один проект, але повернусь до цього. Я звітую ще через кілька тижнів. Дякую!
NonStandardModel

4

Ви можете заблокувати програму до одного ядра, використовуючи, schedutilsяк описано в цій статті про Cyberciti :

sudo apt-get install schedutils
sudo taskset -c 3 -p 13545  # Lock PID 13545 to core 3

Хоча інші процеси все ще можуть бути заплановані на тому ж ядрі. Тож друге, що потрібно зробити, - переконатися, що ваша команда працює з найвищим пріоритетом, використовуючи команду nice (це підкаже ядро ​​Linux, що інші процеси слід попередньо виконувати за потреби). Запустіть програму таким чином:

nice -n -20 your-program

Існують деякі інші можливі причини ваших проблем із термінами. З цим не так просто:

  • Якщо ви програмуєте в Python, є смітник, який іноді призупиняє вашу програму, щоб звільнити невикористану пам'ять.
  • Переривання змушує процесор керувати чимось іншим, ніж ви хочете. Наприклад, мережеві пакети або інший вхід / вихід.
  • Якщо ваша програма багато спить, можливі й інші процеси, що заповнюють кеші процесора (кеш L1 / L2). Це змушує вас чекати доступу до оперативної пам’яті.
    • Ще гірше, якщо ваша оперативна пам’ять заповнена, так що ваш процес заміниться на диск, тому що SD-карти є непростіми.

Існують способи зробити ваш процес у режимі реального часу , а це означає, що він буде працювати з певними гарантіями часу. Проблема в цьому полягає в тому, що все інше може бути повільніше, і це складна тема. Якщо ви хочете спуститися з цієї кролячої нори, я пропоную вам почати читати про процеси в режимі реального часу в Linux .


2
Замість приємного, краще було б надати процесу пріоритет у режимі реального часу, який би забезпечив його перевага на відміну від процесів у реальному часі.
Джоан

Добрий момент, я додам до цього записку.
Еміль Вікстрем

1
"gc.disable ()", що станеться, якщо вимкнути збирач сміття?
Кін

@Keine Ви можете отримати витік пам'яті. Скажімо, у вас є об’єкт A, який має змінну, яка вказує на B. Python буде відслідковувати цю посилання як число, воно знає, що B має 1 об'єкт, спрямований на нього. Видаліть A, коли він вам більше не потрібен. Орієнтовна кількість для B зменшиться, і якщо вона досягне 0, Python також може звільнити B. Це називається опорним підрахунком. Але тепер кажуть , що Б є опорна назад до А. Тепер у вас є скупчення об'єктів , що вказують один до одного. Жоден із них не вдариться до 0 і буде звільнений. GC може знайти такі кластери та видалити їх, коли основна програма не вказує "кластер".
Еміль Вікстрем

1
Я додам пропозиції, які ви зробили до мого проекту. Але я сподіваюся уникати занадто складних тем. У цьому випадку я вважаю, що краще зробити виявлення переривань мікроконтролера та підключити його до RPi лише для збереження даних. Дякую!
NonStandardModel

2

Оскільки у вас є вимоги до термінів, Raspberry Pi вже не є відповідною платформою для цього. Це не реальна платформа в реальному часі, і час може бути скинутий багатьма різними джерелами перешкод.

Натомість вам слід використовувати мікроконтролер для вимірювання цього часу, бажано, використовуючи переривання, і передавати інформацію пізніше.


1
Чи не можливо отримати переривання на штифтах GPIO на Raspberry Pi?
Флоріан Кастеллан

Звичайно, це залежить від того, чи є якась інша частина вимог до дизайну, що робить машину Linux більш доцільною, ніж MCU. RPi здатний чудово впоратися з цим завданням, як і MCU, що працює на частоті 10 МГц.
Шон Хуліхане

1

Згідно з вашою вимогою, я не думаю, що вам потрібно використовувати одноядерний процесор. Вам потрібно переконатися, що ваша програма працює весь час. Для цього ви можете встановити пріоритет своєї програми дуже високим, щоб він не заважав жодному іншому процесу.

Наскільки я знаю ОС (ОС загального призначення), яку ми використовуємо, не розроблена для використання в системах реального часу, тому, якщо ви хочете запустити процес у режимі реального часу, щоб жоден інший процес його не заважав, вам потрібно перейти для ОС у режимі реального часу (RTOS). Можливо, вони придумають основний відбір. :)


1
Чи є там хороші безкоштовні RTOS?
Кін

RTLinux і Vxworks - приклади RTOS, і вони також хороші. Але перед тим, як встановити, вам потрібно вивчити ОС (на чому полягало в її створенні), щоб вона змогла задовольнити ваші потреби.
Vishwajeet Vishu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.