openamp — fornece suporte padrão a Multiprocessamento Assimétrico (AMP)

O módulo openamp fornece uma infraestrutura padrão de comunicação interprocessador para o MicroPython. O módulo lida com todos os detalhes do OpenAMP, como configurar a tabela de recursos compartilhados, inicializar vrings, etc. Ele fornece uma API para usar a infraestrutura de barramento RPMsg com a classe Endpoint e oferece suporte ao Gerenciamento de Ciclo de Vida (LCM) do processador, como carregar firmware e iniciar e parar um núcleo remoto, por meio da classe RemoteProc.

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

Funções

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

Define o novo callback de serviço.

O argumento ns_callback é uma função que será chamada quando o processador remoto anunciar novos serviços. Nesse momento o processador host pode optar por criar o endpoint anunciado, caso esse serviço específico seja suportado, ou ignorá-lo caso não seja. Se essa função não for definida, o processador host deve primeiro registrar o endpoint localmente, e ele será automaticamente vinculado quando o remoto anunciar o serviço.

Classe Endpoint

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

Constrói um novo Endpoint RPMsg. Um endpoint é um canal de comunicação bidirecional entre dois núcleos.

Os argumentos são:

  • name é o nome do endpoint.

  • callback é uma função chamada quando o endpoint recebe dados, com o endereço de origem do ponto remoto e os dados como bytes passados por referência.

  • src é o endereço de origem do endpoint. Se nenhum for fornecido, um será atribuído ao endpoint pela biblioteca.

  • dest é o endereço de destino do endpoint. Se o endpoint for criado a partir do new_service_callback, este deve ser fornecido e deve corresponder ao endereço de origem do endpoint remoto. Se o endpoint for registrado localmente, antes do anúncio, o endereço de destino será atribuído pela biblioteca quando o endpoint for vinculado.

deinit() None

Destrói o endpoint e libera todos os seus recursos.

is_ready() bool

Retorna True se o endpoint estiver pronto para enviar (ou seja, possui tanto o endereço de origem quanto o de destino)

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

Envia uma mensagem ao processador remoto por meio deste endpoint.

Os argumentos são:

  • buffer é o payload da mensagem (qualquer objeto que suporte o protocolo de buffer, por exemplo bytes, bytearray ou str).

  • src é o endereço do endpoint de origem da mensagem. Se nenhum for fornecido, é usado o endereço de origem ao qual o endpoint está vinculado.

  • dest é o endereço do endpoint de destino da mensagem. Se nenhum for fornecido, é usado o endereço de destino ao qual o endpoint está vinculado.

  • timeout especifica o tempo em milissegundos a aguardar por um buffer livre. Por padrão a função é bloqueante.

Classe RemoteProc

Aviso

No STM32H7, o segundo núcleo AMP é um Cortex-M4 que não pode ser parado e então reiniciado no lugar. Portanto, chamar RemoteProc.stop() ou RemoteProc.shutdown() nessa plataforma realiza um reset completo do sistema em vez de uma parada por núcleo.

class openamp.RemoteProc(entry: str | int)

O objeto RemoteProc fornece suporte ao Gerenciamento de Ciclo de Vida (LCM) do processador, como carregar firmware e iniciar e parar um núcleo remoto.

O argumento entry pode ser um caminho para uma imagem de firmware, caso em que o firmware é carregado do arquivo para a sua memória de destino, ou um endereço de ponto de entrada, caso em que o firmware já deve estar carregado no endereço fornecido.

start() None

Inicia o processador remoto.

stop() None

Para o processador remoto. O comportamento exato depende da plataforma.

shutdown() None

O shutdown para o processador remoto e libera todos os seus recursos. O comportamento exato depende da plataforma, porém tipicamente ele desabilita a alimentação e os clocks do núcleo remoto. Esta função também é usada como finalizadora (ou seja, chamada quando o objeto RemoteProc é coletado).