Posso avere 1 core del processore solo per il mio programma?


12

Devo cronometrare la differenza di tempo tra high -> low e low -> high signal edge sui pin GPIO. Ho scritto un semplice programma per farlo. Dopo averlo eseguito per un po 'di tempo, sono stato abbastanza soddisfatto del risultato (variazioni di 0,01 s). Ma di tanto in tanto c'era un errore di 0,5 s. Stavo pensando che questo potrebbe essere dovuto a qualche altro processo di sistema in esecuzione in quel momento. Quindi la mia domanda è:

Posso riservare un core del processore solo per il mio programma e lasciare altri 3 core per il sistema?

Sto usando Raspbian Jessie Lite, quindi penso che 3 core saranno sufficienti per eseguirlo.


4
Presumo che tu stia eseguendo il polling in loop per lo stato del pin GPIO. Questo è altamente sensibile al modo in cui il sistema operativo decide di eseguire il programma, che impiegherà la maggior parte del tempo a tenere occupata la CPU senza fare nulla di veramente utile. Potresti voler cercare un modo per impostare un interrupt su un dato pin GPIO, che puoi usare per far dormire il tuo programma tra i bordi del segnale sui pin GPIO.
Florian Castellane,

4
Non sei sicuro di quale sia il tuo progetto, ma a volte un microcontrollore si adatta meglio, soprattutto quando hai bisogno di più un sistema più simile a quello in tempo reale. Arduino offre molte opzioni e puoi scrivere il tuo programma in C / C ++.
SnakeDoc

@Florian C'è una funzione in RPi.GPIO che è simile all'interrupt. Bloccherà il programma fino a quando non viene rilevato il bordo (fonte: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs ).
Modello non standard

@SnakeDoc So che il microcontrollore è migliore. Speravo di evitarlo, perché non ho bisogno di precisione al microsecondo. 1/100 di secondo è più che sufficiente. Inoltre ho bisogno solo del tempo diff, quindi se c'è un ritardo speravo che fosse lo stesso per l'avvio e l'arresto. Se questo non funziona devo andare con il microcontrollore collegato a RPi per memorizzare i dati.
Modello non standard

1
O ottenere un sistema operativo in tempo reale in esecuzione sul PI. Il problema con la configurazione è che dipende dal "miglior sforzo" da parte del sistema operativo. A seconda di cosa sta succedendo nello stesso momento in cui il tuo programma richiede l'accesso privilegiato ai GPIO, potrebbe essere messo in coda dietro ad altre attività che il sistema operativo sta eseguendo in quel momento. Il tuo programma utente avrà una priorità inferiore rispetto alle attività di sistema. C'è anche la prelazione, il che significa che durante il runtime del programma potrebbe essere "messo in pausa e" messo da parte "dal sistema operativo per l'esecuzione di un altro processo, il che significa che le tue osservazioni di temporizzazione potrebbero essere distorte.
SnakeDoc

Risposte:


13

Dedicare un nucleo è probabilmente eccessivo.

Ti suggerisco di provare la mia biblioteca di pigpio . Per impostazione predefinita, i tempi cambieranno il livello GPIO entro 10µs.

Come test rapido ti suggerisco di guardare questo esempio di Python , che stamperà qualsiasi transizione a livello GPIO e il tempo in microsecondi dall'ultima transizione su quel GPIO.

pigpio non è installato per impostazione predefinita in Jessie Lite. Installa l'ultima dal sito collegato o installa la versione precedente nei repository.

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)

Proverò la tua biblioteca di pigpio. In questo momento devo finire un altro progetto, ma tornerò su questo. Riferirò tra qualche settimana. Grazie!
Modello non standard

4

Puoi bloccare il tuo programma su un core usando schedutilscome descritto in questo articolo di Cyberciti :

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

Tuttavia, è possibile programmare altri processi sullo stesso core. Quindi la seconda cosa da fare è assicurarsi che il tuo comando venga eseguito con la massima priorità usando il comando nice (questo dirà al kernel Linux che altri processi dovrebbero essere anticipati se necessario). Avvia il tuo programma in questo modo:

nice -n -20 your-program

Ci sono alcune altre possibili ragioni per i tuoi problemi di tempistica. Questi non sono così facili da fare per:

  • Se stai programmando in Python c'è un garbage collector che a volte mette in pausa il programma per liberare memoria inutilizzata.
  • Interrupt fa sì che la CPU gestisca qualcos'altro di quello che desideri. Ad esempio, pacchetti di rete o altri input / output.
  • Se il tuo programma sta dormendo molto, potrebbero esserci altri processi che riempiono le cache della CPU (cache L1 / L2). Questo ti costringe ad attendere l'accesso alla RAM.
    • Ancora peggio se la RAM è piena in modo che il tuo processo venga scambiato su disco perché le schede SD sono sloooow.

Esistono modi per rendere il processo in tempo reale , il che significa che verrà eseguito con determinate garanzie di temporizzazione. Il problema è che tutto il resto potrebbe essere più lento ed è un argomento complesso. Se vuoi andare in questa tana del coniglio ti suggerisco di iniziare a leggere sui processi in tempo reale in Linux .


2
Piuttosto che bello, sarebbe meglio dare la priorità al processo in tempo reale, il che garantirebbe che venga eseguito preferibilmente ai processi non in tempo reale.
joan

Bene, aggiungerò una nota a riguardo.
Emil Vikström,

1
"gc.disable ()" cosa succede se si disabilita il Garbage Collector?
Keine,

@Keine È possibile ottenere una perdita di memoria. Supponiamo che tu abbia un oggetto A che ha una variabile che punta a B. Python seguirà questo riferimento come un numero, sa che B ha 1 oggetto che punta verso di esso. Rimuovi A quando non ti serve più. Il conteggio dei riferimenti per B diminuirà e se raggiunge 0 Python può liberare anche B. Questo si chiama conteggio dei riferimenti. Ma ora dire che B ha un riferimento torna ad A. Ora avete un gruppo di oggetti che puntano a vicenda. Nessuno di loro colpirà 0 e verrà liberato. GC può trovare tali cluster e rimuoverli quando il programma principale non punta "nel" cluster.
Emil Vikström,

1
Aggiungerò i suggerimenti che hai dato al mio progetto. Ma spero di evitare argomenti troppo complessi. In quel caso suppongo sia meglio fare in modo che un microcontrollore interrompa il rilevamento e collegarlo a RPi solo per salvare i dati. Grazie!
Modello non standard

2

Dal momento che stai avendo requisiti di temporizzazione Raspberry Pi non è più la piattaforma appropriata per questo. Non è una piattaforma in tempo reale e il tempismo può essere respinto da molte diverse fonti di interferenza.

Invece dovresti usare un microcontrollore per misurare questo tempo, preferibilmente usando gli interrupt, e passare le informazioni al Pi in seguito.


1
Tuttavia, non è possibile ottenere interruzioni sui pin GPIO su un Raspberry Pi?
Florian Castellane,

Sicuramente questo dipende se ci sono altre parti dei requisiti di progettazione che rendono una macchina linux più appropriata di una MCU. RPi è in grado di gestire bene questo compito, così come un MCU con clock a 10 MHz.
Sean Houlihane,

1

Secondo le vostre esigenze, non penso che sia necessario utilizzare un processore single core. Ciò di cui hai bisogno è assicurarti che il tuo programma sia sempre in esecuzione. Per raggiungere questo obiettivo, puoi impostare la priorità del tuo programma molto alta, in modo che non venga disturbato da nessun altro processo.

Per quanto ne so il SO (General Purpose OS), che utilizziamo non sono progettati per essere utilizzati in sistemi in tempo reale, quindi se si desidera eseguire il processo in tempo reale in modo che nessun altro processo lo disturbi, è necessario andare per un sistema operativo in tempo reale (RTOS). Forse verranno fuori con la selezione di base. :)


1
Ci sono buoni RTOS gratuiti là fuori?
Keine,

RTLinux e Vxworks sono esempi di RTOS e sono anche buoni. Ma è necessario studiare il sistema operativo (quale era l'obiettivo principale per la sua creazione) prima dell'installazione, in modo che possa soddisfare le tue esigenze.
Vishwajeet Vishu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.