openamp — oferă suport standard pentru multiprocesare asimetrică (AMP)

Modulul openamp oferă o infrastructură standard de comunicații inter-procesor pentru MicroPython. Modulul gestionează toate detaliile OpenAMP, cum ar fi configurarea tabelului de resurse partajate, inițializarea vring-urilor etc. Acesta oferă o API pentru utilizarea infrastructurii de magistrală RPMsg prin clasa Endpoint și oferă suport pentru gestionarea ciclului de viață al procesorului (LCM), cum ar fi încărcarea firmware-ului și pornirea și oprirea unui nucleu la distanță, prin clasa RemoteProc.

Exemplu de utilizare:

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

Funcții

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

Setează noua funcție de retroapelare pentru servicii.

Argumentul ns_callback este o funcție care va fi apelată atunci când procesorul la distanță anunță servicii noi. În acel moment, procesorul gazdă poate alege să creeze endpoint-ul anunțat, dacă acest serviciu anume este acceptat, sau să îl ignore dacă nu este. Dacă această funcție nu este setată, procesorul gazdă ar trebui să înregistreze mai întâi endpoint-ul local, iar acesta va fi legat automat atunci când procesorul la distanță anunță serviciul.

Clasa Endpoint

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

Construiește un nou Endpoint RPMsg. Un endpoint este un canal de comunicație bidirecțional între două nuclee.

Argumentele sunt:

  • name este numele endpoint-ului.

  • callback este o funcție care este apelată atunci când endpoint-ul primește date, cu adresa sursă a punctului la distanță și datele ca octeți transmise prin referință.

  • src este adresa sursă a endpoint-ului. Dacă nu este furnizată niciuna, una îi va fi atribuită endpoint-ului de către bibliotecă.

  • dest este adresa de destinație a endpoint-ului. Dacă endpoint-ul este creat din new_service_callback, aceasta trebuie furnizată și trebuie să corespundă adresei sursă a endpoint-ului la distanță. Dacă endpoint-ul este înregistrat local, înainte de anunț, adresa de destinație va fi atribuită de bibliotecă atunci când endpoint-ul este legat.

deinit() None

Distruge endpoint-ul și eliberează toate resursele sale.

is_ready() bool

Returnează True dacă endpoint-ul este pregătit pentru transmitere (adică are atât o adresă sursă, cât și una de destinație)

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

Trimite un mesaj către procesorul la distanță prin acest endpoint.

Argumentele sunt:

  • buffer este conținutul util al mesajului (orice obiect care acceptă protocolul buffer, de exemplu bytes, bytearray sau str).

  • src este adresa endpoint-ului sursă al mesajului. Dacă nu este furnizată niciuna, se folosește adresa sursă la care este legat endpoint-ul.

  • dest este adresa endpoint-ului de destinație al mesajului. Dacă nu este furnizată niciuna, se folosește adresa de destinație la care este legat endpoint-ul.

  • timeout specifică timpul în milisecunde pentru a aștepta un tampon liber. În mod implicit, funcția este blocantă.

Clasa RemoteProc

Atenționare

Pe STM32H7, al doilea nucleu AMP este un Cortex-M4 care nu poate fi oprit și apoi repornit pe loc. Apelarea metodei RemoteProc.stop() sau RemoteProc.shutdown() pe acea platformă efectuează prin urmare o resetare completă a sistemului, nu o oprire per nucleu.

class openamp.RemoteProc(entry: str | int)

Obiectul RemoteProc oferă suport pentru gestionarea ciclului de viață al procesorului (LCM), cum ar fi încărcarea firmware-ului, pornirea și oprirea unui nucleu la distanță.

Argumentul entry poate fi o cale către o imagine de firmware, caz în care firmware-ul este încărcat din fișier în memoria sa țintă, sau o adresă de punct de intrare, caz în care firmware-ul trebuie să fie deja încărcat la adresa dată.

start() None

Pornește procesorul la distanță.

stop() None

Oprește procesorul la distanță. Comportamentul exact depinde de platformă.

shutdown() None

Shutdown oprește procesorul la distanță și eliberează toate resursele sale. Comportamentul exact depinde de platformă, însă de obicei dezactivează alimentarea și ceasurile către nucleul la distanță. Această funcție este folosită și ca finalizator (adică este apelată atunci când obiectul RemoteProc este colectat).