‪Multicores ‎assimétricos no desenvolvimento de sistemas embarcados - P5
‪Multicores‬ ‎assimétricos‬ no desenvolvimento de sistemas embarcados – Parte 5 – Projeto Final
Projeto final sobre comunicação entre cores com a Multicore Communication library. Nele serão dados exemplos de comunicação entre núcleos.
Este post faz parte da série Multicores assimétricos. Leia também os outros posts da série:
Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 1
Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 2: Eclipse
Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 3: Firmware M4
Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 4: Prática
Comunicação entre cores com a Multicore Communication library
Vamos iniciar os exemplos que estabelecem a comunicação entre núcleos. Conforme fizemos nos exemplos anteriores, o Núcleo A5 comandou o LED1 e Botão1 e o M4 comandou o LED2 e Botão2. Nesse exemplo vamos fazer o Botão1 (A5) enviar uma mensagem para o Led2 (M4) e o Botão2 (M4) enviar uma mensagem para o Led1 (A5).
O Fluxograma a seguir ilustra bem esse exemplo:
Figura 1: Fluxograma apresentando a lógica dos programas
MultiCore Communication Library
Para utilizar a biblioteca mcc, é importante entender as funções básicas para estabelecer essa comunicação. Um resumo das funções dessa API é:
Inicialização/Informação
mcc_initialize (Inicializa MCC para um determinado NODE)
mcc_destroy (Destroi MCC para determinado NODE)
mcc_get_info (Retorna informações sobre o MCC)
mcc_create_endpoint (Cria um endpoint)
mcc_destroy_endpoint (Destroi um endpoint)
mcc_send (Envia menssagem para determinado endpoint)
mcc_receive_copy/mcc_receive_nocopy (Recebe menssagem de um endpoint)
mcc_msgs_available (Retorna a quantidade de menssagens na fila do endpoint)
mcc_free_buffer (Limpa o buffer da última menssagem da função mcc_receive_nocopy)
No exemplo desse projeto, só usaremos as funções em negrito. A figura abaixo ilustra como é estabelecida e organizada a comunicação:
Figura 2: Funcionamento da MCC
Nesse exemplo, vamos usar o Projeto "MCC_A5" e "MCC_M4" para implementar a troca de mensagens. Abra os projetos com botão direito em cima do projeto e "Open Project".
Compile, copie para a placa e execute primeiro o código correspondente ao M4:
Compilando o Firmware para o M4
Compile o projeto MCC_M4 conforme o menu:
Project > Clean…
Project > Build All
Feito isso, o binario "MCC_M4.bin" será gerado.
Executando o Firmware para o M4
Para executar o firmware, copie o arquivo binario para a placa usando SSH:
scp /home/usuario/curso/workspace/MCC_M4/src/MCC_M4.bin root@192.168.10.2:/home/root/
Acesse o terminal da placa, suba o modulo mcc e em seguida lance a aplicação:
modprobe mcc mqxboot /home/root/MCC_M4.bin 0x8f000400 0x0f000411
modprobe mcc
mqxboot /home/root/MCC_M4.bin 0x8f000400 0x0f000411
Compilando o projeto para o Core A5
Conforme o exemplo anterior, compile usando o menu:
Realizando o Debug do Core A5
Uma vez compilado o projeto, é importante atualizar a arvore do projeto para que o Eclipse encontre o arquivo Binário. Clique com o botão direito no projeto e selecione:
Para realizar o Debug, acesse o menu:
Run > Debug Configuration
Figura 3: Configuration Menu
Depurando a comunicação MCC. Para entender melhor a comunicação entre os dois núcleos, coloque um breakpoint no código em:
Figura 4: Breakpoint
Sendo assim, ao pressionar o botão2 a mensagem será enviada pelo M4 e o A5 receberá nessa linha.
<< Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 4: Prática
Raul Rosetto Muñoz é graduado em Engenharia Elétrica pela Universidade São Francisco. Desde 2008, tem trabalhando na área de sistemas embarcados. No começo da sua carreira trabalhou com desenvolvimento de software para microcontroladores. Nos últimos 8 anos, tem focado no desenvolvimento e customização de Linux embarcado. Atualmente é engenheiro de aplicação e vendas na empresa Toradex Brasil, empresa global com matriz na Suíça qual desenvolve computadores em módulo de alta performance.