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.
- 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,bytearraylubstr).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.
- 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
RemoteProcjest usuwany przez garbage collector).