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