openamp — fornisce il supporto standard per l’Asymmetric Multiprocessing (AMP)¶
Il modulo openamp fornisce un’infrastruttura standard di comunicazione tra processori per MicroPython. Il modulo gestisce tutti i dettagli di OpenAMP, come la configurazione della shared resource table, l’inizializzazione dei vring, ecc. Fornisce un’API per l’utilizzo dell’infrastruttura del bus RPMsg tramite la classe Endpoint, e fornisce il supporto al Life Cycle Management (LCM) dei processori, come il caricamento del firmware e l’avvio e l’arresto di un core remoto, tramite la classe RemoteProc.
Esempio di utilizzo:
import openamp
def ept_recv_callback(src, data):
print("Received message on endpoint", data)
# Create a new RPMsg endpoint to communicate with the remote core.
ept = openamp.Endpoint("vuart-channel", callback=ept_recv_callback)
# Create a RemoteProc object, load its firmware and start it.
rproc = openamp.RemoteProc("virtual_uart.elf") # Or entry point address (ex 0x081E0000)
rproc.start()
while True:
if ept.is_ready():
ept.send("data")
Funzioni¶
- openamp.new_service_callback(ns_callback: Callable[[str, int], Any]) None¶
Imposta il nuovo callback di servizio.
L’argomento ns_callback è una funzione che verrà chiamata quando il processore remoto annuncia nuovi servizi. A quel punto il processore host può scegliere di creare l’endpoint annunciato, se questo particolare servizio è supportato, oppure ignorarlo se non lo è. Se questa funzione non è impostata, il processore host dovrebbe prima registrare l’endpoint localmente, e questo verrà associato automaticamente quando il remoto annuncia il servizio.
Classe Endpoint¶
- class openamp.Endpoint(name: str, callback: Callable[[int, bytes], Any], src: int = ENDPOINT_ADDR_ANY, dest: int = ENDPOINT_ADDR_ANY)¶
Costruisce un nuovo Endpoint RPMsg. Un endpoint è un canale di comunicazione bidirezionale tra due core.
Gli argomenti sono:
name è il nome dell’endpoint.
callback è una funzione che viene chiamata quando l’endpoint riceve dati, con l’indirizzo sorgente del punto remoto e i dati passati per riferimento come bytes.
src è l’indirizzo sorgente dell’endpoint. Se non viene fornito, ne verrà assegnato uno all’endpoint dalla libreria.
dest è l’indirizzo di destinazione dell’endpoint. Se l’endpoint viene creato dal new_service_callback, questo deve essere fornito e deve corrispondere all’indirizzo sorgente dell’endpoint remoto. Se l’endpoint viene registrato localmente, prima dell’annuncio, l’indirizzo di destinazione verrà assegnato dalla libreria quando l’endpoint viene associato.
- is_ready() bool¶
Restituisce True se l’endpoint è pronto per l’invio (ovvero, ha sia un indirizzo sorgente che uno di destinazione)
- send(buffer: bytes, *, src: int = -1, dest: int = -1, timeout: int = -1) int¶
Invia un messaggio al processore remoto tramite questo endpoint.
Gli argomenti sono:
buffer è il payload del messaggio (qualsiasi oggetto che supporta il protocollo buffer, ad es.
bytes,bytearrayostr).src è l’indirizzo dell’endpoint sorgente del messaggio. Se non viene fornito, viene usato l’indirizzo sorgente a cui l’endpoint è associato.
dest è l’indirizzo dell’endpoint di destinazione del messaggio. Se non viene fornito, viene usato l’indirizzo di destinazione a cui l’endpoint è associato.
timeout specifica il tempo in millisecondi da attendere per un buffer libero. Per impostazione predefinita la funzione è bloccante.
Classe RemoteProc¶
Avvertimento
Sull’STM32H7 il secondo core AMP è un Cortex-M4 che non può essere arrestato e poi riavviato in loco. La chiamata a RemoteProc.stop() o RemoteProc.shutdown() su quella piattaforma esegue quindi un reset completo del sistema anziché un arresto del singolo core.
- class openamp.RemoteProc(entry: str | int)¶
L’oggetto RemoteProc fornisce il supporto al Life Cycle Management (LCM) dei processori, come il caricamento del firmware e l’avvio e l’arresto di un core remoto.
L’argomento entry può essere un percorso a un’immagine firmware, nel qual caso il firmware viene caricato dal file alla sua memoria di destinazione, oppure un indirizzo di entry point, nel qual caso il firmware deve essere già caricato all’indirizzo specificato.
- shutdown() None¶
Lo shutdown arresta il processore remoto e rilascia tutte le sue risorse. Il comportamento esatto dipende dalla piattaforma, tuttavia tipicamente disabilita l’alimentazione e i clock del core remoto. Questa funzione viene usata anche come finalizzatore (ovvero, viene chiamata quando l’oggetto
RemoteProcviene deallocato).