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.
- 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,bytearrayoderstr).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.
- 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).