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

O módulo openamp fornece uma infraestrutura padrão de comunicação entre processadores para MicroPython. O módulo trata de todos os detalhes do OpenAMP, como configurar a tabela de recursos partilhados, inicializar os vrings, etc. Fornece uma API para utilizar a infraestrutura de barramento RPMsg com a classe Endpoint, e oferece suporte de Gestão do Ciclo de Vida do Processador (LCM), como carregar firmware e iniciar e parar um núcleo remoto, através da classe RemoteProc.

Exemplo de utilização:

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 ponto, o processador anfitrião pode optar por criar o endpoint anunciado, se este serviço específico for suportado, ou ignorá-lo se não for. Se esta função não estiver definida, o processador anfitrião deve primeiro registar o endpoint localmente, e este será automaticamente associado quando o processador 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 RPMsg Endpoint. 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 não for fornecido nenhum, a biblioteca atribuirá um ao endpoint.

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

deinit() None

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

is_ready() bool

Devolve True se o endpoint estiver pronto para enviar (ou seja, tem endereço de origem e de destino)

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

Envia uma mensagem ao processador remoto por este endpoint.

Os argumentos são:

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

  • src é o endereço de endpoint de origem da mensagem. Se não for fornecido nenhum, utiliza-se o endereço de origem ao qual o endpoint está associado.

  • dest é o endereço de endpoint de destino da mensagem. Se não for fornecido nenhum, utiliza-se o endereço de destino ao qual o endpoint está associado.

  • timeout especifica o tempo em milissegundos a aguardar por um buffer livre. Por predefiniçã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 depois reiniciado no mesmo lugar. Chamar RemoteProc.stop() ou RemoteProc.shutdown() nessa plataforma realiza, portanto, um reset completo do sistema em vez de uma paragem por núcleo.

class openamp.RemoteProc(entry: str | int)

O objeto RemoteProc fornece suporte de Gestão do Ciclo de Vida do Processador (LCM), como carregar firmware, 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 ficheiro 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 indicado.

start() None

Inicia o processador remoto.

stop() None

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

shutdown() None

Shutdown para o processador remoto e liberta todos os seus recursos. O comportamento exato depende da plataforma, mas tipicamente desativa a alimentação e os clocks do núcleo remoto. Esta função também é utilizada como finalizador (ou seja, chamada quando o objeto RemoteProc é recolhido pelo garbage collector).