openamp — bietet Standardunterstützung für asymmetrisches Multiprocessing (AMP)

Das Modul openamp bietet eine standardisierte Infrastruktur für die Kommunikation zwischen Prozessoren für MicroPython. Das Modul übernimmt alle Details von OpenAMP, wie das Einrichten der gemeinsamen Ressourcentabelle, das Initialisieren von vrings usw. Es stellt eine API zur Nutzung der RPMsg-Bus-Infrastruktur mit der Klasse Endpoint bereit und bietet über die Klasse RemoteProc Unterstützung für das Life Cycle Management (LCM) von Prozessoren, etwa das Laden von Firmware sowie das Starten und Stoppen eines Remote-Kerns.

Anwendungsbeispiel:

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

Funktionen

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

Legt den Callback für neue Dienste fest.

Das Argument ns_callback ist eine Funktion, die aufgerufen wird, wenn der Remote-Prozessor neue Dienste ankündigt. An diesem Punkt kann der Host-Prozessor entscheiden, ob er den angekündigten Endpoint erstellt (falls dieser bestimmte Dienst unterstützt wird) oder ihn ignoriert (falls nicht). Wenn diese Funktion nicht gesetzt ist, sollte der Host-Prozessor den Endpoint zunächst lokal registrieren; er wird dann automatisch gebunden, wenn der Remote den Dienst ankündigt.

Endpoint-Klasse

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

Erzeugt einen neuen RPMsg-Endpoint. Ein Endpoint ist ein bidirektionaler Kommunikationskanal zwischen zwei Kernen.

Die Argumente sind:

  • name ist der Name des Endpoints.

  • callback ist eine Funktion, die aufgerufen wird, wenn der Endpoint Daten empfängt; ihr werden die Quelladresse des Remote-Punkts und die Daten als Bytes per Referenz übergeben.

  • src ist die Quelladresse des Endpoints. Wird keine angegeben, weist die Bibliothek dem Endpoint eine zu.

  • dest ist die Zieladresse des Endpoints. Wenn der Endpoint aus dem new_service_callback erstellt wird, muss dieser Wert angegeben werden und mit der Quelladresse des Remote-Endpoints übereinstimmen. Wenn der Endpoint lokal registriert wird, also vor der Ankündigung, weist die Bibliothek die Zieladresse zu, wenn der Endpoint gebunden wird.

deinit() None

Zerstört den Endpoint und gibt alle seine Ressourcen frei.

is_ready() bool

Gibt True zurück, wenn der Endpoint sendebereit ist (d. h. sowohl eine Quell- als auch eine Zieladresse besitzt).

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

Sendet eine Nachricht über diesen Endpoint an den Remote-Prozessor.

Die Argumente sind:

  • buffer ist die Nutzlast der Nachricht (ein beliebiges Objekt, das das Pufferprotokoll unterstützt, z. B. bytes, bytearray oder str).

  • src ist die Quell-Endpoint-Adresse der Nachricht. Wird keine angegeben, wird die Quelladresse verwendet, an die der Endpoint gebunden ist.

  • dest ist die Ziel-Endpoint-Adresse der Nachricht. Wird keine angegeben, wird die Zieladresse verwendet, an die der Endpoint gebunden ist.

  • timeout gibt die Zeit in Millisekunden an, die auf einen freien Puffer gewartet wird. Standardmäßig blockiert die Funktion.

RemoteProc-Klasse

Warnung

Auf dem STM32H7 ist der zweite AMP-Kern ein Cortex-M4, der nicht angehalten und anschließend an Ort und Stelle neu gestartet werden kann. Der Aufruf von RemoteProc.stop() oder RemoteProc.shutdown() auf dieser Plattform führt daher einen vollständigen Systemreset durch, statt einen einzelnen Kern anzuhalten.

class openamp.RemoteProc(entry: str | int)

Das RemoteProc-Objekt bietet Unterstützung für das Life Cycle Management (LCM) von Prozessoren, etwa das Laden von Firmware sowie das Starten und Stoppen eines Remote-Kerns.

Das Argument entry kann ein Pfad zu einem Firmware-Image sein, in welchem Fall die Firmware aus der Datei in ihren Zielspeicher geladen wird, oder eine Einstiegspunktadresse, in welchem Fall die Firmware bereits an der angegebenen Adresse geladen sein muss.

start() None

Startet den Remote-Prozessor.

stop() None

Stoppt den Remote-Prozessor. Das genaue Verhalten ist plattformabhängig.

shutdown() None

Shutdown stoppt den Remote-Prozessor und gibt alle seine Ressourcen frei. Das genaue Verhalten ist plattformabhängig, typischerweise werden jedoch Strom und Takte für den Remote-Kern abgeschaltet. Diese Funktion wird auch als Finalizer verwendet (d. h. aufgerufen, wenn das RemoteProc-Objekt eingesammelt wird).