Prove con la gestione realtime dei GPIO della Raspberry Pi

In questo articolo sto inserendo un pò di appunti sulla libreria rpgpio.py che consente di generare segnali su GPIO tramite DMA in modo che non ci siano time lack dovuti al sistema operativo e che le CPU siano completamente scariche e disponibili per il sistema operativo e le applicazioni utente.

Di seguito alcune prove che ho effettuato salvando solo i due file:

e scrivendo di volta in volta il pezzetto di codice d'esempio in un file chiamato prova.py. Per lanciarlo:

sudo python prova.py

Prova base su una linea GPIO

Invia dieci impulsi da un secondo usando la libreria rpgpio. Qui il realtime non c'entra ancora nulla.

from rpgpio import GPIO
import time

pin = 21
g= GPIO()

for i in range(10):
    g.init(pin, GPIO.MODE_OUTPUT)
    g.set(pin)
    print("set " + str(g.read(pin)))
    time.sleep(1)
    g.clear(pin)
    print("clear " + str(g.read(pin)))
    time.sleep(1)

Il sorgente della classe GPIO() è qui:

Test di allocazione di memoria

Alloca memoria, ci scrive sopra e controlla e rilegge cosa ha scritto. Anche qui il realtime non c'entra ancora nulla :-).

from rpgpio_private import *

cma = CMAPhysicalMemory(1*1024*1024)
print(str(cma.get_size() / 1024 / 1024) + "MB of memory allocated at "
      + hex(cma.get_phys_address()))
a = cma.read_int(0)
print("was " + hex(a))
cma.write_int(0, 0x12345678)
a = cma.read_int(0)
assert a == 0x12345678, "Memory isn't written or read correctly"
print("now " + hex(a))
del cma

Il sorgente della funzione CMAPhysicalMemory() è qui:

Invio impulsi via DMA

Primo esempio per generare impulsi. Genera impulsi da 2 uS sul pin GPIO21.

Sembra che la risoluzione minima sia 2 uS, se provo a mettere 1uS non scende al di sotto dei 2 uS.

from rpgpio import DMAGPIO,GPIO
import sys

pin = 21
g=GPIO()
g.init(pin, GPIO.MODE_OUTPUT)

dg = DMAGPIO()
dg.add_pulse(1 << pin, 2)
dg.add_delay(2)
dg.run(True)
print("dmagpio is started")
try:
    print("press enter to stop...")
    sys.stdin.readline()
except KeyboardInterrupt:
    pass
dg.stop()
g.clear(pin)
print("dma stopped")

Il sorgente della classe DMAGPIO() è qui:

Pinout della Raspberry Pi

Links

Altri link

Sergio Tanzilli (Autore - Progettista hw & sw - Imprenditore - Musicista dilettante, classe 1964)
Fondatore di Area SX srl, Acme Systems srl e del TanzoLab, si occupa dal 1974 di elettronica digitale, dal 1978 di microprocessori, dal 1992 di microcontroller, dal 1995 di Linux e pubblicazioni su Web, dal 2005 di progettazione, produzione e commercializzazione di schede Linux Embedded.
http://www.tanzilli.com - http://www.acmesystems.it - https://github.com/tanzilli - sergio@tanzilli.com