openamp — zapewnia standardową obsługę przetwarzania asymetrycznego (AMP)

Moduł openamp zapewnia standardową infrastrukturę komunikacji międzyprocesorowej dla MicroPython. Moduł obsługuje wszystkie szczegóły OpenAMP, takie jak konfiguracja współdzielonej tablicy zasobów, inicjalizacja vringów itp. Udostępnia API do korzystania z infrastruktury magistrali RPMsg za pomocą klasy Endpoint oraz zapewnia obsługę zarządzania cyklem życia procesora (LCM), taką jak ładowanie oprogramowania układowego oraz uruchamianie i zatrzymywanie zdalnego rdzenia, za pomocą klasy RemoteProc.

Przykład użycia:

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

Funkcje

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

Ustawia nowe wywołanie zwrotne usługi.

Argument ns_callback to funkcja, która zostanie wywołana, gdy zdalny procesor ogłosi nowe usługi. W tym momencie procesor hosta może zdecydować o utworzeniu ogłoszonego punktu końcowego, jeśli dana usługa jest obsługiwana, lub zignorować ją, jeśli nie jest. Jeśli ta funkcja nie zostanie ustawiona, procesor hosta powinien najpierw zarejestrować punkt końcowy lokalnie, a zostanie on automatycznie powiązany, gdy zdalny procesor ogłosi usługę.

Klasa Endpoint

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

Tworzy nowy punkt końcowy RPMsg. Punkt końcowy to dwukierunkowy kanał komunikacyjny pomiędzy dwoma rdzeniami.

Argumenty:

  • name to nazwa punktu końcowego.

  • callback to funkcja wywoływana, gdy punkt końcowy odbierze dane, której przekazywany jest adres źródłowy zdalnego punktu oraz dane jako bajty przekazane przez referencję.

  • src to adres źródłowy punktu końcowego. Jeśli nie zostanie podany, biblioteka przydzieli punktowi końcowemu jeden adres.

  • dest to adres docelowy punktu końcowego. Jeśli punkt końcowy jest tworzony z new_service_callback, należy go podać i musi on odpowiadać adresowi źródłowemu zdalnego punktu końcowego. Jeśli punkt końcowy jest rejestrowany lokalnie, przed ogłoszeniem, adres docelowy zostanie przydzielony przez bibliotekę w momencie powiązania punktu końcowego.

deinit() None

Niszczy punkt końcowy i zwalnia wszystkie jego zasoby.

is_ready() bool

Zwraca True, jeśli punkt końcowy jest gotowy do wysyłania (tzn. ma zarówno adres źródłowy, jak i docelowy).

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

Wysyła wiadomość do zdalnego procesora przez ten punkt końcowy.

Argumenty:

  • buffer to ładunek wiadomości (dowolny obiekt obsługujący protokół bufora, np. bytes, bytearray lub str).

  • src to adres źródłowego punktu końcowego wiadomości. Jeśli nie zostanie podany, używany jest adres źródłowy, z którym powiązany jest punkt końcowy.

  • dest to adres docelowego punktu końcowego wiadomości. Jeśli nie zostanie podany, używany jest adres docelowy, z którym powiązany jest punkt końcowy.

  • timeout określa czas w milisekundach oczekiwania na wolny bufor. Domyślnie funkcja jest blokująca.

Klasa RemoteProc

Ostrzeżenie

W STM32H7 drugim rdzeniem AMP jest Cortex-M4, którego nie można zatrzymać, a następnie ponownie uruchomić w tym samym miejscu. Wywołanie RemoteProc.stop() lub RemoteProc.shutdown() na tej platformie powoduje zatem pełny reset systemu, a nie zatrzymanie pojedynczego rdzenia.

class openamp.RemoteProc(entry: str | int)

Obiekt RemoteProc zapewnia obsługę zarządzania cyklem życia procesora (LCM), taką jak ładowanie oprogramowania układowego oraz uruchamianie i zatrzymywanie zdalnego rdzenia.

Argument entry może być ścieżką do obrazu oprogramowania układowego, w którym to przypadku oprogramowanie jest ładowane z pliku do docelowej pamięci, lub adresem punktu wejścia, w którym to przypadku oprogramowanie układowe musi być już załadowane pod podanym adresem.

start() None

Uruchamia zdalny procesor.

stop() None

Zatrzymuje zdalny procesor. Dokładne zachowanie zależy od platformy.

shutdown() None

Shutdown zatrzymuje zdalny procesor i zwalnia wszystkie jego zasoby. Dokładne zachowanie zależy od platformy, jednak zazwyczaj wyłącza zasilanie i zegary zdalnego rdzenia. Funkcja ta jest również używana jako finalizator (tzn. wywoływana, gdy obiekt RemoteProc jest usuwany przez garbage collector).