openamp — proporciona soporte estándar de Multiprocesamiento Asimétrico (AMP)

El módulo openamp proporciona una infraestructura estándar de comunicaciones entre procesadores para MicroPython. El módulo gestiona todos los detalles de OpenAMP, como la configuración de la tabla de recursos compartidos, la inicialización de las vrings, etc. Ofrece una API para utilizar la infraestructura del bus RPMsg mediante la clase Endpoint, y proporciona soporte de Gestión del Ciclo de Vida (LCM) del procesador, como cargar firmware e iniciar y detener un núcleo remoto, a través de la clase RemoteProc.

Ejemplo de uso:

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

Funciones

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

Establece la nueva función de retorno (callback) de servicio.

El argumento ns_callback es una función que se llamará cuando el procesador remoto anuncie nuevos servicios. En ese momento, el procesador anfitrión puede optar por crear el endpoint anunciado, si admite ese servicio en concreto, o ignorarlo si no es así. Si esta función no se establece, el procesador anfitrión debería registrar primero el endpoint de forma local, y este se enlazará automáticamente cuando el remoto anuncie el servicio.

Clase Endpoint

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

Construye un nuevo Endpoint RPMsg. Un endpoint es un canal de comunicación bidireccional entre dos núcleos.

Los argumentos son:

  • name es el nombre del endpoint.

  • callback es una función que se llama cuando el endpoint recibe datos, con la dirección de origen del punto remoto y los datos pasados por referencia como bytes.

  • src es la dirección de origen del endpoint. Si no se proporciona ninguna, la biblioteca asignará una al endpoint.

  • dest es la dirección de destino del endpoint. Si el endpoint se crea desde new_service_callback, debe proporcionarse y debe coincidir con la dirección de origen del endpoint remoto. Si el endpoint se registra localmente, antes del anuncio, la biblioteca asignará la dirección de destino cuando el endpoint se enlace.

deinit() None

Destruye el endpoint y libera todos sus recursos.

is_ready() bool

Devuelve True si el endpoint está listo para enviar (es decir, tiene tanto una dirección de origen como de destino).

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

Envía un mensaje al procesador remoto a través de este endpoint.

Los argumentos son:

  • buffer es la carga útil del mensaje (cualquier objeto que admita el protocolo de búfer, p. ej. bytes, bytearray o str).

  • src es la dirección de origen del endpoint del mensaje. Si no se proporciona ninguna, se utiliza la dirección de origen a la que está enlazado el endpoint.

  • dest es la dirección de destino del endpoint del mensaje. Si no se proporciona ninguna, se utiliza la dirección de destino a la que está enlazado el endpoint.

  • timeout especifica el tiempo en milisegundos que se espera por un búfer libre. De forma predeterminada, la función es bloqueante.

Clase RemoteProc

Advertencia

En el STM32H7, el segundo núcleo AMP es un Cortex-M4 que no puede detenerse y reiniciarse en el sitio. Por lo tanto, llamar a RemoteProc.stop() o RemoteProc.shutdown() en esa plataforma realiza un reinicio completo del sistema en lugar de una detención por núcleo.

class openamp.RemoteProc(entry: str | int)

El objeto RemoteProc proporciona soporte de Gestión del Ciclo de Vida (LCM) del procesador, como cargar firmware e iniciar y detener un núcleo remoto.

El argumento entry puede ser una ruta a una imagen de firmware, en cuyo caso el firmware se carga desde el archivo a su memoria de destino, o una dirección de punto de entrada, en cuyo caso el firmware ya debe estar cargado en la dirección indicada.

start() None

Inicia el procesador remoto.

stop() None

Detiene el procesador remoto. El comportamiento exacto depende de la plataforma.

shutdown() None

Shutdown detiene el procesador remoto y libera todos sus recursos. El comportamiento exacto depende de la plataforma, aunque normalmente desactiva la alimentación y los relojes del núcleo remoto. Esta función también se utiliza como finalizador (es decir, se llama cuando se recolecta el objeto RemoteProc).