Tutorial: Criar uma aplicação com capacidade em tempo real

Este tutorial mostra como criar uma aplicação de exemplo para os núcleos em tempo real num dispositivo do Azure Sphere. Veja Descrição geral das aplicações do Azure Sphere para obter informações básicas sobre aplicações com capacidade em tempo real.

Neste tutorial, irá aprender a:

  • Transferir uma aplicação de exemplo
  • Instalar a cadeia de ferramentas arm do GNU
  • Configurar o hardware para apresentar a saída
  • Ativar o desenvolvimento e a depuração
  • Iniciar um emulador de terminal para ver a saída
  • Criar, executar e depurar uma aplicação em tempo real

Importante

Estas instruções partem do princípio de que está a utilizar hardware que segue o hardware de design do quadro de referência (RDB) MT3620, como o Mt3620 Dev Kit da Seeed Studios. Se estiver a utilizar hardware diferente do Azure Sphere, consulte a documentação do fabricante para saber se o UART está exposto e como aceder ao mesmo. Poderá ter de configurar o hardware para apresentar a saída de forma diferente e atualizar o código de exemplo e o campo Uarts do ficheiro app_manifest.json para utilizar um UART diferente.

Pré-requisitos

Transferir a aplicação de exemplo

Pode transferir a aplicação HelloWorld da seguinte forma:

  1. Aponte o browser para o Browser de Exemplos da Microsoft.
  2. Escreva "Azure Sphere" na caixa Pesquisa.
  3. Selecione Azure Sphere - Hello World nos resultados da pesquisa.
  4. Selecione Transferir ZIP.
  5. Abra o ficheiro transferido e extraia para um diretório local.

Instalar a Cadeia de Ferramentas GNU Arm Embedded

Pode transferir e instalar a Cadeia de Ferramentas GNU Arm Embedded a partir do site de programador do Arm. Em alternativa, pode utilizar artefactos vcpkg para instalar e configurar automaticamente o ambiente de desenvolvimento.

  • Visual Studio 2022: se estiver a utilizar o Visual Studio 2022, instale o GNU Arm Embedded Toolchain (arm-none-eabi) a partir do site do programador arm.
  • Visual Studio 2019: a cadeia de ferramentas é instalada automaticamente com a extensão azure-sphere para Visual Studio no Visual Studio 2019. Se estiver a utilizar o Visual Studio 2019, avance para Configurar hardware para apresentar a saída. No entanto, se instalou manualmente o GNU Arm Embedded Toolchain, o Visual Studio utilizará a versão que instalou.

Para instalar a cadeia de ferramentas, no site do programador arm, localize a Cadeia de Ferramentas GNU Arm Embedded (arm-none-eabi) que inclui o compilador do processador Cortex-M4 do ARM. Siga as instruções para transferir e instalar o compilador para a sua plataforma de SO.

Por predefinição, o Visual Studio Code procura a cadeia de ferramentas e deverá encontrar a versão que instalou. Se encontrar problemas de compilação relacionados com a cadeia de ferramentas, introduza o caminho da seguinte forma:

  1. SelecioneDefinições de Preferências>> de Ficheiro>Extensões>do Azure Sphere.
  2. Introduza o caminho de instalação da Cadeia de Ferramentas GNU Arm Embedded na definição Caminho do Azure Sphere: Arm Gnu .

Para instalar a cadeia de ferramentas, no site do programador arm, localize a Cadeia de Ferramentas GNU Arm Embedded (arm-none-eabi) que inclui o compilador do processador Cortex-M4 do ARM. Siga as instruções para transferir e instalar o compilador para a sua plataforma de SO.

Configurar o hardware para apresentar a saída

Atualmente, cada núcleo em tempo real suporta um UART apenas TX. O RTApps pode utilizar este UART para enviar a saída de registo do dispositivo. Durante o desenvolvimento e depuração de aplicações, normalmente precisa de uma forma de ler e apresentar o resultado. O exemplo de HelloWorld_RTApp_MT3620_BareMetal mostra como uma aplicação pode escrever no UART.

Utilize um adaptador USB para série, como o FTDI Friend, para ligar o UART no núcleo em tempo real a uma porta USB no seu computador. Também precisará de um emulador terminal para estabelecer uma ligação de série com as definições de terminal 115200-8-N-1 (115200 bps, 8 bits, sem bits de paridade, um bit de paragem) para apresentar a saída.

Para configurar o hardware para apresentar a saída de uma RTApp, siga estes passos. Terá de consultar a documentação do fabricante do hardware para determinar as localizações dos pinos. Se estiver a utilizar hardware que segue o hardware de design do quadro de referência (RDB) MT3620, como o Mt3620 Dev Kit da Seeed Studios, observar os cabeçalhos da interface RDB pode ajudá-lo a determinar as localizações dos pinos.

  1. Ligue o GND no adaptador USB para série ao GND no seu kit de programador. No hardware RDB MT3620, GND é Cabeçalho 3, pin 2.
  2. Ligue o RX no adaptador USB para série ao IOM4-0 TX no seu kit de programador. No hardware RDB MT3620, IOM4-0 TX é Cabeçalho 3, pin 6.
  3. Ligue o adaptador USB para série a uma porta USB gratuita no seu computador de desenvolvimento e determine a que porta o dispositivo de série está ligado. No Windows, inicie Gestor de Dispositivos, selecione Ver>Dispositivos por contentor e procure "UART USB". Por exemplo, FT232R USB UART indica o adaptador FTDI Friend.
  4. Inicie um programa de emulador terminal e abra um terminal 115200-8-N-1 para a porta COM utilizada pelo adaptador. Veja a documentação do emulador terminal para saber como especificar a porta e a velocidade.

Configurar o hardware para apresentar a saída

Atualmente, cada núcleo em tempo real suporta um UART apenas TX. O RTApps pode utilizar este UART para enviar a saída de registo do dispositivo. Durante o desenvolvimento e depuração de aplicações, normalmente precisa de uma forma de ler e apresentar o resultado. O exemplo de HelloWorld_RTApp_MT3620_BareMetal mostra como uma aplicação pode escrever no UART.

Utilize um adaptador USB para série, como o FTDI Friend, para ligar o UART no núcleo em tempo real a uma porta USB no seu computador. Também precisará de um emulador terminal para estabelecer uma ligação de série com as definições de terminal 115200-8-N-1 (115200 bps, 8 bits, sem bits de paridade, um bit de paragem) para apresentar a saída.

Para configurar o hardware para apresentar a saída de uma RTApp, siga estes passos. Terá de consultar a documentação do fabricante do hardware para determinar as localizações dos pinos. Se estiver a utilizar hardware que segue o hardware de design do quadro de referência (RDB) MT3620, como o Mt3620 Dev Kit da Seeed Studios, observar os cabeçalhos da interface RDB pode ajudá-lo a determinar as localizações dos pinos.

  1. Ligue o GND no adaptador USB para série ao GND no seu kit de programador. No hardware RDB MT3620, GND é Cabeçalho 3, pin 2.

  2. Ligue o RX no adaptador USB para série ao IOM4-0 TX no seu kit de programador. No hardware RDB MT3620, IOM4-0 TX é Cabeçalho 3, pin 6.

  3. Ligue o adaptador USB para série a uma porta USB gratuita no seu computador de desenvolvimento e determine a que porta o dispositivo de série está ligado.

    • No Windows, inicie Gestor de Dispositivos, selecione Ver>Dispositivos por contentor e procure "UART USB". Por exemplo, FT232R USB UART indica o adaptador FTDI Friend.

    • No Linux, escreva o seguinte comando:

      dmesg | grep ttyUSB
      

      A porta deve ter o nome ttyUSBn, em que n indica o número da porta. Se o dmesg comando listar várias portas USB, a que está ligada à normalmente a última comunicada como anexada. Por exemplo, no seguinte, utilizaria ttyUSB4:

    ~$ dmesg | grep ttyUSB
    [  144.564350] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB0
    [  144.564768] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB1
    [  144.565118] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB2
    [  144.565593] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB3
    [  144.570429] usb 1-1.1.3: FTDI USB Serial Device converter now attached to ttyUSB4
    [  254.171871] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1
    
  4. Inicie um programa de emulador terminal e abra um terminal 115200-8-N-1 para a porta COM utilizada pelo adaptador. Veja a documentação do emulador terminal para saber como especificar a porta e a velocidade.

Ativar o desenvolvimento e a depuração

Antes de poder criar uma aplicação de exemplo no seu dispositivo do Azure Sphere ou desenvolver novas aplicações para o mesmo, tem de ativar o desenvolvimento e a depuração. Por predefinição, os dispositivos do Azure Sphere estão "bloqueados"; ou seja, não permitem que as aplicações em desenvolvimento sejam carregadas a partir de um PC e não permitem a depuração de aplicações. Preparar o dispositivo para depuração remove esta restrição e carrega o software necessário para depurar e desbloqueia as capacidades do dispositivo.

Para depurar os núcleos em tempo real, utilize o comando az sphere device enable-development . Este comando configura o dispositivo para aceitar aplicações de um PC para depuração e atribui o dispositivo ao grupo de dispositivos de Desenvolvimento, que não permite atualizações de aplicações na cloud. Durante o desenvolvimento e depuração de aplicações, deve deixar o dispositivo neste grupo para que as atualizações da aplicação na cloud não substituam a aplicação em desenvolvimento.

No Windows, tem de adicionar o --enable-rt-core-debugging parâmetro , que carrega os servidores de depuração e os controladores necessários para cada tipo de núcleo no dispositivo.

  1. Inicie sessão no Azure Sphere se ainda não o tiver feito:

    az login
    
  2. Abra uma interface de linha de comandos com o PowerShell ou a Linha de Comandos do Windows com privilégios de administrador. O --enable-rt-core-debugging parâmetro requer privilégios de administrador porque instala controladores USB para o depurador.

  3. Introduza o seguinte comando:

    az sphere device enable-development --enable-rt-core-debugging  --catalog <CatalogName>  --resource-group <ResourceGroupName>
    
  4. Feche a janela após a conclusão do comando porque o privilégio de administrador já não é necessário. Como melhor prática, deve sempre utilizar o privilégio mais baixo que pode realizar uma tarefa.

Se o comando az sphere device enable-development falhar, veja Resolver problemas do Azure Sphere para obter ajuda.

Criar e executar a aplicação HelloWorld RTApp com o Visual Studio

  1. Inicie o Visual Studio. Selecione Abrir uma pasta local, navegue para a pasta onde extraiu o ficheiro Azure_Sphere___Hello_World.zip transferido e, em seguida, selecione a pasta HelloWorld_RTApp_MT3620_Baremetal.

  2. Se não estiver a utilizar um RDB MT3620, atualize o ficheiro de app_manifest.json e o código de exemplo para especificar o UART correto, por exemplo ISU1.

  3. Se a geração CMake não iniciar automaticamente, selecione o ficheiro CMakeLists.txt.

  4. Na janela Saída do Visual Studio , a saída CMake deve mostrar as mensagens CMake generation started. e CMake generation finished..

  5. Selecione Criar>Tudo. Se o menu não estiver presente, abra Explorador de Soluções, clique com o botão direito do rato no ficheiro de CMakeLists.txt e selecione Compilar. A localização de saída da aplicação HelloWorld_RTApp_MT3620_Baremetal é apresentada na janela Saída .

  6. No menu Selecionar Item de Arranque , selecione HelloWorld_RTApp_MT3620_Baremetal (RTCore).

  7. Prima F5 para implementar a aplicação.

  8. O emulador de terminal ligado deve apresentar a saída do programa HelloWorld_RTApp_MT3620_Baremetal. O programa envia as seguintes palavras em intervalos de um segundo:

    Tick

    Tock

  9. Utilize o depurador para definir pontos de interrupção, inspecionar variáveis e experimentar outras tarefas de depuração.

Criar e executar a aplicação HelloWorld RTApp com o Visual Studio Code

  1. No Visual Studio Code, abra a pasta HelloWorld_RTApp_MT3620_BareMetal na pasta onde extraiu o ficheiro Azure_Sphere___Hello_World.zip transferido. Se lhe for pedido para selecionar um kit, selecione Não utilizar um kit.

  2. Se não estiver a utilizar hardware RDB MT3620, atualize o ficheiro de app_manifest.json e o código de exemplo para especificar o UART correto, por exemplo ISU1.

  3. Prima F5 para iniciar o depurador. Se o projeto não tiver sido criado anteriormente ou se os ficheiros tiverem sido alterados e a reconstrução for necessária, o Visual Studio Code compilará o projeto antes do início da depuração.

  4. A janela de saída do Azure Sphere deve mostrar "A implementar imagem..." seguido dos caminhos para o SDK e compilador.

  5. O emulador de terminal ligado deve apresentar a saída do programa HelloWorld_RTApp_MT3620_Baremetal. O programa envia as seguintes palavras em intervalos de um segundo:

    Tick

    Tock

  6. Utilize as funcionalidades de depuração do Visual Studio Code para definir pontos de interrupção, inspecionar variáveis e experimentar outras tarefas de depuração.

Resolução de problemas

A aplicação pode começar a ser executada antes de o OpenOCD efetuar uma ligação. Como resultado, os pontos de interrupção definidos no início do código podem não ser apresentados. Uma solução simples para isto é atrasar o início da aplicação até que o OpenOCD se ligue.

  1. Insira o seguinte código no início do ponto de entrada da aplicação RTCoreMain. Isto fará com que a aplicação introduza e permaneça num while ciclo até que a variável f esteja definida como true.

     volatile bool f = false;
     while (!f) {
        // empty.
     }
    
  2. Prima F5 para iniciar a aplicação com a depuração (F5) e, em seguida, invada a execução.

  3. No painel Depuração Locais , altere o valor de f zero para um.

  4. Siga o código como habitualmente.

Criar o exemplo

  1. Abra uma interface de linha de comandos com o PowerShell, a Linha de Comandos do Windows ou a shell de comandos do Linux. Navegue para o diretório de compilação do projeto.

  2. No diretório de compilação do projeto, na linha de comandos, execute CMake com os seguintes parâmetros:

    cmake --preset <preset-name> <source-path>
    
    • --preset <preset-name>

      O nome predefinido da configuração da compilação, conforme definido no CMakePresets.json.

    • --build <cmake-path>

      O diretório binário que contém a cache CMake. Por exemplo, se executar o CMake num exemplo do Azure Sphere, o comando build será cmake --build out/ARM-Debug.

    • <source-path>

      O caminho do diretório que contém os ficheiros de origem da aplicação de exemplo. No exemplo, o repositório de exemplos do Azure Sphere foi transferido para um diretório chamado AzSphere.

      Os parâmetros CMake são separados por espaços. O caráter de continuação da linha (^ para a linha de comandos do Windows, \ para a linha de comandos do Linux ou ' para o PowerShell) pode ser utilizado para legibilidade, mas não é necessário.

    Os exemplos seguintes mostram os comandos CMake para uma RTApp. Quando indicado, substitua <file-path> pelo caminho de instalação da Cadeia de Ferramentas GNU Arm Embedded no seu sistema.

    Linha de Comandos do Windows

    cmake ^
    --preset "ARM-Debug" ^
    "C:\AzSphere\azure-sphere-samples\Samples\HelloWorld\HelloWorld_RTApp_MT3620_BareMetal"
    

    Windows PowerShell

    cmake `
    --preset "ARM-Debug" `
    "C:\AzSphere\azure-sphere-samples\Samples\HelloWorld\HelloWorld_RTApp_MT3620_BareMetal"
    
  3. Execute Ninja para criar a aplicação e criar o ficheiro de pacote de imagem:

    ninja -C out/ARM-Debug
    

    Ninja coloca a aplicação resultante e os ficheiros .imagepackage no diretório especificado.

    Também pode invocar Ninja através de CMake com o seguinte comando:

    cmake --build out/<binary-dir>
    

    Defina <binary-dir> como o diretório binário que contém a cache CMake. Por exemplo, se executar o CMake num exemplo do Azure Sphere, o comando build será cmake --build out/ARM-Debug.

Ao resolver problemas, especialmente depois de efetuar alterações aos comandos CMake, elimine toda a sua criação e tente novamente.

Executar o exemplo

  1. Elimine todas as aplicações que já estejam implementadas no dispositivo:

    az sphere device sideload delete
    
  2. No diretório do projeto, na linha de comandos, carregue o pacote de imagem que ninja criou:

    az sphere device sideload deploy --image-package <path-to-imagepackage>
    

    A aplicação começará a ser executada logo após ser carregada. O seguinte será apresentado no emulador do terminal ligado:

    Tick
    
    Tock
    
    Tick
    .
    .
    .
    
  3. Obtenha o ID do componente da imagem:

    az sphere image-package show --image-package <path-to-imagepackage>
    

    O comando devolve todos os metadados do pacote de imagem. O ID do componente da aplicação é apresentado na secção Identidade do Tipo de Imagem da Aplicação. Por exemplo:

    ...
      "Identity": {
        "ComponentId": "<component-id>",
        "ImageId": "<image-id>",
        "ImageType": "Application"
      },
    ...
    

    Pode utilizar os seguintes comandos para parar, iniciar e obter o estado da aplicação:

    az sphere device app stop --component-id <component id>
    
    az sphere device app start --component-id <component id>
    
    az sphere device app show-status --component-id <component id>
    

Depurar o exemplo

  1. Pare a aplicação se estiver em execução.

    az sphere device app stop --component-id <component id>
    
  2. Reinicie a aplicação para depuração.

    az sphere device app start --debug-mode true  --component-id <component id>
    

    Este comando devolve o núcleo no qual a aplicação está em execução.

    <component id>
    App state   : running
    Core        : Real-time 0
    
  3. Navegue para a pasta Openocd para obter o sysroot com o qual a aplicação foi criada. Os sysroots são instalados na pasta de instalação do SDK do Azure Sphere. Por exemplo, no Windows, a pasta é instalada por predefinição em C:\Program Files (x86)\Microsoft Azure Sphere SDK\Sysroots\*sysroot*\tools\openocd e no Linux, em /opt/azurespheresdk/Sysroots/*sysroot*/tools/sysroots/x86_64-pokysdk-linux.

  4. Execute openocd como mostra o seguinte exemplo. O exemplo pressupõe que a aplicação está em execução no núcleo 0. Se a aplicação estiver em execução no núcleo 1, substitua "targets io0" por "targets io1".

    openocd -f mt3620-rdb-ftdi.cfg -f mt3620-io0.cfg -c "gdb_memory_map disable" -c "gdb_breakpoint_override hard" -c init -c "targets io0" -c halt -c "targets"
    
  5. Navegue para a pasta que contém o ficheiro .out da aplicação e inicie arm-none-eabi-gdb, que faz parte da Cadeia de Ferramentas GNU Arm Embedded:

    Linha de Comandos do Windows

    "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" HelloWorld_RTApp_MT3620_BareMetal.out
    

    Windows PowerShell

    & "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" HelloWorld_RTApp_MT3620_BareMetal.out
    
  6. O servidor OpenOCD fornece uma interface de servidor GDB em :4444. Defina o destino para depuração.

    target remote :4444

  7. Agora pode executar comandos gdb.

  8. O emulador de terminal ligado deve apresentar a saída da aplicação.

Utilizar aplicações de parceiros

Quando carrega uma aplicação para o dispositivo do Azure Sphere, as ferramentas de implementação do Azure Sphere eliminam todas as aplicações existentes por predefinição. Para impedir que isto aconteça quando desenvolve aplicações que comunicam entre si, tem de marcar as aplicações como parceiros. Quando implementa uma das aplicações, os respetivos parceiros não serão eliminados. Veja Marcar aplicações como parceiros para obter detalhes.

Passos seguintes