openamp — poskytuje standardní podporu asymetrického multiprocessingu (AMP)

Modul openamp poskytuje pro MicroPython standardní infrastrukturu pro komunikaci mezi procesory. Modul řeší všechny detaily OpenAMP, jako je nastavení sdílené tabulky zdrojů, inicializace vringů atd. Poskytuje API pro používání infrastruktury sběrnice RPMsg pomocí třídy Endpoint a poskytuje podporu správy životního cyklu procesoru (LCM), jako je načítání firmwaru a spouštění a zastavování vzdáleného jádra, prostřednictvím třídy RemoteProc.

Příklad použití:

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")

Funkce

openamp.new_service_callback(ns_callback: Callable[[str, int], Any]) None

Nastaví callback pro nové služby.

Argument ns_callback je funkce, která bude zavolána, když vzdálený procesor oznámí nové služby. V tu chvíli se hostitelský procesor může rozhodnout vytvořit oznámený endpoint, pokud je tato konkrétní služba podporována, nebo jej ignorovat, pokud podporována není. Pokud tato funkce není nastavena, měl by hostitelský procesor nejprve zaregistrovat endpoint lokálně a ten bude automaticky navázán, jakmile vzdálený procesor službu oznámí.

Třída Endpoint

class openamp.Endpoint(name: str, callback: Callable[[int, bytes], Any], src: int = ENDPOINT_ADDR_ANY, dest: int = ENDPOINT_ADDR_ANY)

Vytvoří nový RPMsg endpoint. Endpoint je obousměrný komunikační kanál mezi dvěma jádry.

Argumenty jsou:

  • name je název endpointu.

  • callback je funkce, která je volána, když endpoint přijme data, se zdrojovou adresou vzdáleného bodu a daty předanými jako byty odkazem.

  • src je zdrojová adresa endpointu. Pokud není žádná zadána, přidělí ji endpointu knihovna.

  • dest je cílová adresa endpointu. Pokud je endpoint vytvořen z new_service_callback, musí být tato adresa zadána a musí odpovídat zdrojové adrese vzdáleného endpointu. Pokud je endpoint zaregistrován lokálně, před oznámením, cílovou adresu přidělí knihovna při navázání endpointu.

deinit() None

Zruší endpoint a uvolní všechny jeho zdroje.

is_ready() bool

Vrací True, pokud je endpoint připraven k odesílání (tj. má zdrojovou i cílovou adresu)

send(buffer: bytes, *, src: int = -1, dest: int = -1, timeout: int = -1) int

Odešle zprávu vzdálenému procesoru přes tento endpoint.

Argumenty jsou:

  • buffer je užitečné zatížení zprávy (libovolný objekt podporující buffer protokol, např. bytes, bytearray nebo str).

  • src je zdrojová adresa endpointu zprávy. Pokud není žádná zadána, použije se zdrojová adresa, ke které je endpoint navázán.

  • dest je cílová adresa endpointu zprávy. Pokud není žádná zadána, použije se cílová adresa, ke které je endpoint navázán.

  • timeout určuje dobu v milisekundách, po kterou se čeká na volný buffer. Ve výchozím nastavení je funkce blokující.

Třída RemoteProc

Varování

Na STM32H7 je druhé AMP jádro Cortex-M4, které nelze zastavit a poté na místě znovu spustit. Volání RemoteProc.stop() nebo RemoteProc.shutdown() na této platformě proto provede úplný reset systému namísto zastavení jednotlivého jádra.

class openamp.RemoteProc(entry: str | int)

Objekt RemoteProc poskytuje podporu správy životního cyklu procesoru (LCM), jako je načítání firmwaru a spouštění a zastavování vzdáleného jádra.

Argument entry může být cesta k obrazu firmwaru, v takovém případě je firmware načten ze souboru do své cílové paměti, nebo adresa vstupního bodu, v takovém případě již musí být firmware načten na zadané adrese.

start() None

Spustí vzdálený procesor.

stop() None

Zastaví vzdálený procesor. Přesné chování závisí na platformě.

shutdown() None

Shutdown zastaví vzdálený procesor a uvolní všechny jeho zdroje. Přesné chování závisí na platformě, typicky však vypne napájení a hodiny vzdáleného jádra. Tato funkce se používá také jako finalizátor (tj. je zavolána, když je objekt RemoteProc uvolněn z paměti).