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