openamp — ger stöd för standardiserad asymmetrisk multiprocessing (AMP)

Modulen openamp tillhandahåller en standardiserad infrastruktur för kommunikation mellan processorer för MicroPython. Modulen hanterar alla detaljer kring OpenAMP, såsom att konfigurera den delade resurstabellen, initiera vrings, osv. Den tillhandahåller ett API för att använda RPMsg-bussinfrastrukturen med klassen Endpoint, och erbjuder stöd för processorns livscykelhantering (LCM), såsom att ladda fast programvara samt att starta och stoppa en fjärrkärna, via klassen RemoteProc.

Exempel på användning:

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

Funktioner

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

Ställer in det nya tjänståteranropet.

Argumentet ns_callback är en funktion som anropas när fjärrprocessorn annonserar nya tjänster. Vid den tidpunkten kan värdprocessorn välja att skapa den annonserade endpointen, om denna specifika tjänst stöds, eller ignorera den om den inte gör det. Om denna funktion inte är inställd bör värdprocessorn först registrera endpointen lokalt, varefter den automatiskt binds när fjärren annonserar tjänsten.

Endpoint-klassen

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

Skapar en ny RPMsg-Endpoint. En endpoint är en dubbelriktad kommunikationskanal mellan två kärnor.

Argumenten är:

  • name är endpointens namn.

  • callback är en funktion som anropas när endpointen tar emot data, med fjärrpunktens källadress och datan som bytes skickad via referens.

  • src är endpointens källadress. Om ingen anges tilldelas en till endpointen av biblioteket.

  • dest är endpointens destinationsadress. Om endpointen skapas från new_service_callback måste denna anges och den måste matcha fjärrendpointens källadress. Om endpointen registreras lokalt, före annonseringen, tilldelas destinationsadressen av biblioteket när endpointen binds.

deinit() None

Förstör endpointen och frigör alla dess resurser.

is_ready() bool

Returnerar True om endpointen är redo att skicka (dvs. har både en käll- och en destinationsadress)

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

Skickar ett meddelande till fjärrprocessorn över denna endpoint.

Argumenten är:

  • buffer är meddelandets nyttolast (vilket objekt som helst som stöder buffertprotokollet, t.ex. bytes, bytearray eller str).

  • src är meddelandets källendpointadress. Om ingen anges används källadressen som endpointen är bunden till.

  • dest är meddelandets destinationsendpointadress. Om ingen anges används destinationsadressen som endpointen är bunden till.

  • timeout anger tiden i millisekunder att vänta på en ledig buffert. Som standard är funktionen blockerande.

RemoteProc-klassen

Varning

På STM32H7 är den andra AMP-kärnan en Cortex-M4 som inte kan stoppas och sedan startas om på plats. Att anropa RemoteProc.stop() eller RemoteProc.shutdown() på den plattformen utför därför en fullständig systemåterställning i stället för ett stopp per kärna.

class openamp.RemoteProc(entry: str | int)

RemoteProc-objektet tillhandahåller stöd för processorns livscykelhantering (LCM), såsom att ladda fast programvara samt att starta och stoppa en fjärrkärna.

Argumentet entry kan vara en sökväg till en avbildning av fast programvara, i vilket fall den fasta programvaran laddas från fil till sitt målminne, eller en ingångspunktsadress, i vilket fall den fasta programvaran redan måste vara laddad på den angivna adressen.

start() None

Startar fjärrprocessorn.

stop() None

Stoppar fjärrprocessorn. Det exakta beteendet är plattformsberoende.

shutdown() None

Shutdown stoppar fjärrprocessorn och frigör alla dess resurser. Det exakta beteendet är plattformsberoende, men vanligtvis stängs ström och klockor till fjärrkärnan av. Denna funktion används även som slutförare (dvs. anropas när RemoteProc-objektet samlas in).