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