Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 4: Prática

Multicore Communication library Multicores assimétricos prática Firmware M4
Este post faz parte da série Multicores assimétricos

Dando sequência à série de artigos que visa auxiliar no desenvolvimento de produtos que façam uso de multicores assimétricos, baseado no computador em módulo Colibri VF61 (Freescale® Vybrid), este capítulo oferece uma parte prática de tudo que foi discutido nos três artigos anteriores.

Iniciando

Para realizar o curso, disponibilizamos em sua mesa o seguinte material:

  1. Computador em módulo Colibri VF61;
  2. Placa Base Iris;
  3. Placa Acessório (3 botões/3 Leds);
  4. Cabo Serial + Adaptador DB9 p/ header X13;
  5. Fonte 12v + Adaptador para ligar na placa;
  6. Cartão SD com imagem do Linux;
  7. Cabo de Rede.

Conectando o módulo na placa base

Para inserir o módulo da família colibri, é necessário inserir o módulo na diagonal no conector SODIMM. Lembre-se que esse conector é compatível entre todos os módulos da Família.

Conexão dos cabos

Conecte o cabo serial conforme a figura abaixo no conector X13 e conecte a placa de testes que contém botões e LEDs que serão utilizados nas práticas.

Multicores assimétricos - Conexão serial na placa IRIS e do acessório com botões e LEDs
Figura 1 – Conexão serial na placa IRIS e do acessório com botões e LEDs

Conecte também o cabo de rede na Ethernet da placa e no computador. Agora no terminal, da máquina Linux, abra o “picocom” na serial correta:

$ picocom -b 115200 /dev/ttyS1

Energize a placa para ver o Linux realizar boot.

Multicores assimétricos - Boot do Linux
Figura 2 – Boot do Linux

Ao terminar, entre com o usuário e senha:

User: root
Password: <vazio>

Alterando IP da placa

Alguns comandos podem ser executados para interagir um pouco com a placa. Para trocar o IP por exemplo, execute a seguinte sequência (por favor não altere o mesmo pois está configurado corretamente para a conexão no Eclipse nas práticas que estão na sequência, o IP deve ser 192.168.10.2):

root@apalis-t30:~# connmanctl services
*AO Wired                { ethernet_00142d269dfd_cable }


root@colibri-t30:~# connmanctl
connmanctl> config ethernet_00142d259a48_cable --ipv4 manual 192.168.10.2 255.255.255.0 192.168.10.1
connmanctl> exit

Trabalhando com GPIO

Para piscar um led, execute os seguintes comandos:

$ echo 47 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio47/direction
$ echo 1 > /sys/class/gpio/gpio47/value
$ echo 0 /sys/class/gpio/gpio47/value

Exemplo 1 – BlinkLed A5

O primeiro exemplo que vamos executar irá apenas piscar o LED1. Esse exemplo tem como objetivo mostrar a integração do Eclipse com o Linux do A5. Ele já deve estar no seu Eclipse na árvore de projetos.

Na sua máquina virtual, abra o projeto “BlinkLed”. Note que o projeto foi configurado conforme os capítulos anteriores.

Multicores assimétricos: firmware-m4-projeto-blink-led
Figura 3 – Projeto Blink Led

Arquivos do projeto

A apiSysClass foi criada para exportar e acessar as GPIOs através do sistema de arquivo do Linux, “/sys/class/gpio”. O arquivo principal, BlinkLed.c utilizando as chamadas para apiSysClass irá, exportar, configurar e Ligar/Desligar o LED1 a cada 500ms.

BlinkLed.c

/*
 ============================================================================
 Name : BlinkLed.c
 Author : Raul Munoz
 Version :
 Copyright : Toradex
 Description : Hello World in C, Ansi-style
 ============================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "apiSysClass.h"

int main(int lArgc, char *pcArgv[])
{
  int lRet = 0;
  // Exporta o LED1 - SODIMM_101 - GPIO_47
  lApiSysClassExport(eLED1);
  // Configura LED1 para OUTPUT
  lApiSysClassDirection(eLED1, eDirection_OutPut);

  while(1)
  {
    lApiSysClassSetValue(eLED1, eValue_Low);
    usleep(500000);
    lApiSysClassSetValue(eLED1, eValue_High);
    usleep(500000);
    puts("!!!Hello Vybrid!!!"); /* prints !!!Hello Vybrid!!! */
  }

  return EXIT_SUCCESS;
}

Compilando para ARM

Na árvore do projeto, existem duas pastas: ARM e DEBUG. Essas pastas contêm os arquivos compilados para as arquiteturas ARM e x86 respectivamente.

Para compilar o projeto para ARM, é necessário certificar-se que o mesmo está configurado para ARM. Aperte botão direito no projeto e selecione: Build Configurations > Set Active > ARM.

Ao selecionar essa configuração o binário será gerado na pasta ARM. Agora podemos compilar os exemplos usando o comando CTRL + B. Ou por meio do menu:

Project > Clean...
Project > Build All

Realizando Debug

Uma vez compilado o projeto, é importante atualizar a árvore do projeto para que o Eclipse encontre o arquivo Binário. Clique com o botão direito no projeto e selecione: Refresh.

Para realizar o Debug, acesse o menu:

Run > Debug Configuration
multicores-assimetricos-pratica-debug
Figura 4 – Configuração do debug

Em seguida clique no botão Debug. Caso a janela de Login na placa apareça, clique em OK para prosseguir. Pode ocorrer também uma solicitação para gerar as chaves de Criptografia, neste caso selecione “Yes”. Nesse momento, uma mensagem solicitando a troca de perspectiva irá aparecer. Ao aceitar, a perspectiva irá trocar para Debug. No menu superior do Eclipse, os botões de debug devem estar habilitados:

multicores-assimetricos-pratica-botoes-eclipse
Figura 5 – Botões do Eclipse

Esses botões, respectivamente, tem a seguinte função:

  1. Resume (Executa a aplicação);
  2. Suspend (Para a aplicação);
  3. Terminate (Cancela);
  4. Disconnect (Desconecta do Target);
  5. Step Into (Entra em uma determinada função);
  6. Step Over (Proxima Linha);
  7. Step Return (Sai da função).

Após os testes para a aplicação através do botão Terminate.

Trocando de Perspectiva

Para voltar a perspectiva anterior, no canto superior direito do Eclipse, selecione o botão C/C++.

multicores-assimetricos-pratica-seleção-de-perspectiva-no-eclipse
Figura 6 – Seleção de perspectiva no Eclipse

Utilize o mesmo menu para voltar a perspectiva Debug.

Finalizando Prática 1

Para fechar o projeto, aperto botão direito no projeto e “Close Project”.

Exemplo 2 – BlinkLed M4

Esse exemplo irá fazer a mesma coisa do exemplo 1 porém comandado pelo M4. Note que nesse exemplo vamos acessar o LED2 e não será possível realizar Debug desse core.

multicores-assimetricos-pratica-estrutura-projeto
Figura 7 – Estrutura de projeto Blink LED M4

Na sua máquina virtual, abra o projeto “BlinkLed_M4”. Note que o projeto foi configurado conforme os capítulos anteriores.

Arquivos do projeto

O arquivo principal, “BlinkLed_M4.c” acessa uma série de API encontradas na pasta build-tree para configurar e Ligar/Desligar o LED2 a cada 500ms.

BlinkLed_M4.c

/*
 * BlinkLed_M4.c
 *
 * (c) 2015 Toradex AG
 */

#include <stdlib.h>
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_if.h>
#include <math.h>
#include "BlinkLed_M4.h"

#define CYGHWR_HAL_VYBRID_PORT_ALT_GPIO 0
#define CYGHWR_HAL_VYBRID_PORT_INPUT 0x21
#define CYGHWR_HAL_VYBRID_PORT_OUTPUT 0x22

// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16

//            SODIMM    GPIO    PORT     IRIS X16
// BOTAO1     98        46      PORTC_1  13
// BOTAO2     133       88      PORTD_9  14
// BOTAP3     103       48      PORTC_3  15
// LED1       101       47      PORTC_2  16
// LED2       97        50      PORTC_5  17
// LED3       85        53      PORTC_8  18

#define BOTAO1 CYGHWR_HAL_VYBRID_PIN(C, 1, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO2 CYGHWR_HAL_VYBRID_PIN(D, 9, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO3 CYGHWR_HAL_VYBRID_PIN(C, 3, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define LED1 CYGHWR_HAL_VYBRID_PIN(C, 2, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED2 CYGHWR_HAL_VYBRID_PIN(C, 5, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED3 CYGHWR_HAL_VYBRID_PIN(C, 8, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)

// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16
#define PUL_PWM CYGHWR_HAL_VYBRID_PIN(B, 19, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)

//Control variables

//Main Thread
int main(int argc, char **argv)
{
    diag_printf("----------------------\n");
    diag_printf(" eCos servo drive demo\n");
    diag_printf("----------------------\n");

    // Initialize GPIO
    hal_set_pin_function(LED2);

    while (true)
    {
        hal_gpio_set_pin(LED2);
        cyg_thread_delay(500);
        hal_gpio_clear_pin(LED2);
        cyg_thread_delay(500);
    }
}

BlinkLed_M4.h

/*
 * BlinkLed_M4.h
 *
 * (c) 2015 Toradex AG
 */

#include <stdio.h>
#include <unistd.h>

#include <cyg/infra/cyg_type.h>
#include <cyg/infra/diag.h>
#include <cyg/hal/hal_io.h>
#include <cyg/hal/var_io.h>
#include <cyg/hal/var_io_gpio.h>
#include <cyg/io/io.h>
#include <cyg/io/serialio.h>
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_if.h>
#include <cyg/kernel/kapi.h>

#ifndef BLINKLED_M4__H_
#define BLINKLED_M4__H_

#define MCC_NODE_A5         (0)
#define MCC_NODE_M4         (0)
#define MCC_SENDER_PORT     (1)
#define MCC_RESPONDER_PORT  (2)

void thread_mcc_fn(void);

#endif /* BLINKLED_M4__H_ */

Compilando o Firmware para o M4

O projeto já está configurado para compilar utilizando o arquivo makefile. O makefile acessa a toolchain já instalada e gera o arquivo binário final conforme os capítulos anteriores. Compile o projeto conforme o menu:

Project > Clean...
Project > Build All

Feito isso, o binário “BlinkLed_M4.bin” será gerado.

Executando o Firmware para o M4

Para executar o firmware, copie o arquivo binário para a placa usando SSH:

scp /home/usuario/curso/workspace/BlinkLed_M4/src/BlinkLed_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/ BlinkLed_M4.bin 0x8f000400 0x0f000411

Nesse ponto, será possível ver o LED2 Piscando.

Finalizando Prática 2

Para fechar o projeto, aperto botão direito no projeto e “Close Project”.

Exemplo 3 – ReadSwitch A5

Nesse exemplo, vamos usar o Projeto BlinkLed para implementar a leitura de um botão. Abra o projeto BlinkLed com botão direito em cima do projeto e “Open Project”.

Altere o Código

Vamos alterar o Código C dele para fazermos a seguinte lógica:

  • Ler Botão 1, Se pressionado Ligar Led1. Caso contrário, Desligar LED1.

No Final, seu arquivo BlinkLed.c deve ficar assim:

BlinkLed.c

/*
 ============================================================================
 Name : BlinkLed.c
 Author : Raul Munoz
 Version :
 Copyright : Toradex
 Description : Hello World in C, Ansi-style
 ============================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "apiSysClass.h"

int main(int lArgc, char *pcArgv[])
{
  //Export Pinos
  lApiSysClassExport(eLED1);
  lApiSysClassExport(eBotao1);
  // Seleciona Direção
  lApiSysClassDirection(eLED1, eDirection_OutPut);
  lApiSysClassDirection(eBotao1, eDirection_Input);
  char lBotao1 = 0;

  while(1)
  {
    lBotao1 = lApiSysClassGetValue(eBotao1);
    printf("eBotao1 Value %d\n",lBotao1);
    lApiSysClassSetValue(eLED1, lBotao1);
    usleep(100000);
  }
  return EXIT_SUCCESS;
}

Compile

Conforme o exemplo anterior, compile usando o menu:

Project > Clean...
Project > Build All

Debug

Uma vez compilado o projeto, é importante atualizar a árvore do projeto para que o Eclipse encontre o arquivo Binário. Clique com o botão direito no projeto e selecione:

Refresh

Para realizar o Debug, acesse o menu:

Run > Debug Configuration
multicores-assimetricos-pratica-run-configuration
Figura 8 – Run Configuration

Em seguida clique no botão Debug.

Exemplo 4 – ReadSwitch M4

Nesse exemplo, vamos usar o Projeto BlinkLed_M4 para implementar a leitura de um botão. Abra o projeto BlinkLed_M4 com botão direito em cima do projeto e “Open Project”.

Altere o Código

Vamos alterar o código C do projeto para mesma lógica do exemplo anterior, porem usando o LED2 e Botão2:

  • Ler Botão 2, Se pressionado Ligar Led2. Caso contrário, Desligar LED2.

No Final, seu arquivo BlinkLed_M4.c deve ficar assim, não esqueça de salvar após executar as alterações:

BlinkLed_M4.c

/*
 * BlinkLed_M4.c
 *
 * (c) 2015 Toradex AG
 */

#include <stdlib.h>
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_if.h>
#include <math.h>
#include "BlinkLed_M4.h"

#define CYGHWR_HAL_VYBRID_PORT_ALT_GPIO 0
#define CYGHWR_HAL_VYBRID_PORT_INPUT 0x21
#define CYGHWR_HAL_VYBRID_PORT_OUTPUT 0x22

// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16

//            SODIMM    GPIO    PORT     IRIS X16
// BOTAO1     98        46      PORTC_1  13
// BOTAO2     133       88      PORTD_9  14
// BOTAP3     103       48      PORTC_3  15
// LED1       101       47      PORTC_2  16
// LED2       97        50      PORTC_5  17
// LED3       85        53      PORTC_8  18

#define BOTAO1 CYGHWR_HAL_VYBRID_PIN(C, 1, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO2 CYGHWR_HAL_VYBRID_PIN(D, 9, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO3 CYGHWR_HAL_VYBRID_PIN(C, 3, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define LED1 CYGHWR_HAL_VYBRID_PIN(C, 2, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED2 CYGHWR_HAL_VYBRID_PIN(C, 5, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED3 CYGHWR_HAL_VYBRID_PIN(C, 8, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)

// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16
#define PUL_PWM CYGHWR_HAL_VYBRID_PIN(B, 19, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)

//Control variables

//Main Thread
int main(int argc, char **argv)
{
    diag_printf("----------------------\n");
    diag_printf(" eCos servo drive demo\n");
    diag_printf("----------------------\n");

    // Initialize GPIO
    hal_set_pin_function(BOTAO2);
    hal_set_pin_function(LED2);

    int lBotao2 = 0;

    while (true)
    {
        lBotao2 = hal_gpio_get_pin(BOTAO2);
        if(lBotao2 == 1)
        {
            hal_gpio_set_pin(LED2);
        }
        else
        {
            hal_gpio_clear_pin(LED2);
        }
        cyg_thread_delay(100);
    }
}

Compilando o Firmware para o M4

O projeto já está configurado para compilar utilizando o arquivo makefile. O makefile acessa a toolchain já instalada e gera o arquivo binário final conforme os capítulos anteriores.

Compile o projeto conforme o menu:

Project > Clean...
Project > Build All

Feito isso, o binário “BlinkLed_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/BlinkLed_M4/src/BlinkLed_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/BlinkLed_M4.bin 0x8f000400 0x0f000411

Nesse ponto, será possivel ver o LED2 Piscando.

Finalizando Prática 4

Para fechar o projeto, aperto botão direito no projeto e “Close Project”.

Multicores assimétricos

Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 3: Firmware M4 ‪Multicores‬ ‎assimétricos‬ no desenvolvimento de sistemas embarcados – Parte 5 – Projeto Final
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
Guilherme
Guilherme
06/06/2020 17:03

Boa tarde
Pode disponibilizar os códigos exemplos?

Home » Software » Sistemas Operacionais » Multicores assimétricos no desenvolvimento de sistemas embarcados – Parte 4: Prática

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: