• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
gpio rilevare cpu stato sovraccaricare senza

[Problema] Rilevare stato GPIO senza sovraccaricare CPU
#1
Buongiorno,
ho necessità di rilevare con un ritardo massimo di qualche secondo il cambiamento di stato di una GPIO. Ho letto che un ciclo if è sconsigliabile perché impegna inutilmente la CPU. Però, anche con l'istruzione 
GPIO.add_event_detect(19, GPIO.RISING, callback=Input_2) la CPU risulta impegnata al 100%. Questo perché l'istruzione while qualcosa dovrò pur metterlo per mantenere attivo il programma. Suggerimenti? Grazie
Risposta
#2
una CPU impegnata al 100% per un ciclo while, mi pare un tantino eccessivo.
Certo è che usare un ciclo while infinito per controllare una variazione di stato, seppur funzionale, e a volte utile a fini didattici, non è la migliore pratica da adottare se si vuole programmare con un certo stile ed efficienza.
piuttosto che bloccare il programma in un loop attendendo un evento, è bene fare in modo che sia l'avvenimento di un evento che possa fermare un attimo il normale flusso del programma per compiere una azione.
Si tratta di tecniche di programmazione: piuttosto che usare un metodo polling (cioè continuare a interrogare una stato in attesa che questo cambi) si ricorre al metodo degli interrupt (cioè il programma continua il suo corso fino a che non sarà il cambiamento di stato a interromperlo momentaneamente).
Non specifichi il linguaggio di programmazione, ma da qual che scrivi, credo tu intenda in Python, e che tu stia provando a utilizzare gli interrupt con la libreria Rpi.GPIO.
Non serve racchiudere la rilevazione dell'evento in un loop infinito, se usi gli interrupt.. altrimenti, torni al polling.
ma nel 2019 (quasi 2020), perchè non utilizzare la libreria gpiozero, che tra i tanti vantaggi offre anche una molto più comoda gestione degli interrupt?
un esempio, preso direttamente dalla documentazione di gpiozero:
Codice:
from gpiozero import LED, Button
from signal import pause

led = LED(17)
button = Button(3)

button.when_pressed = led.on
button.when_released = led.off

pause()
una volta dichiarato il pulsante (pin 3), il sistema può rilevare quando premuto (when_pressed) e fare una azione (led.on) e quando viene rilasciato (when _released) e fare altra azione (led.off), usando il metodo degli interrupt.
pause() alla fine serve a evitare che il programma finisca perché giunto al suo termine
come vedi non ci sono tempi di attesa o loop.
Risposta
#3
Grazie. Non conoscevo l'istruzione <pause> e utilizzavo, impropriamente,< While> per non uscire dal programma impegnando, così, la CPU inutilmente.
Risposta
  


Vai al forum:


Navigazione: 1 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect