Zephyr RTOS – Instalando o Ambiente de Desenvolvimento

Este post faz parte da série Zephyr RTOS + Nordic

O Zephyr é o RTOS da Linux Foundation. Ele é totalmente Open Source e possui licença Apache 2.0, sendo gratuito para uso tanto em aplicações não comerciais quanto comerciais.

Possui versões estáveis (LTS) com patches de segurança e uma comunidade com 976 contribuidores no GitHub e mais de 200 placas de desenvolvimento com suporte pronto para este RTOS.

Esta série de artigos utilizará como base de hardware a plataforma nRF da Nordic, porém o Zephyr é agnóstico e pode ser utilizado em diversas outras arquiteturas – e não só Arm, mas também Risc V e muitas outras.

Entre as diversas empresas que são membros do projeto, destacam-se, a própria Nordic Semiconductor, a NXP e a Intel, porém diversos outros fabricantes têm contribuído e portado suas arquiteturas para o projeto.

Neste primeiro artigo falaremos sobre algumas maneiras de instalar o ambiente do RTOS para desenvolvimento.

Eu tenho desenvolvido em Windows, portanto demonstrarei o fluxo de instalação neste OS, mas o ambiente pode ser também Linux ou Mac OS.

Neste momento não é recomendado usar o Zephyr em WSL2, pois não há suporte oficial para uso de USB nem para fazer chamadas de aplicativos do Windows host.

Antes de avançarmos, é importante dizer que o Zephyr faz uso do west. O west é a ferramenta do Zephyr tanto para montar e compilar o seu RTOS e aplicação, quanto para fazer o download dos diversos repositórios do projeto. Você verá que é uma ferramenta muito versátil e será utilizada em diversos passos do processo.

Instalação do Zephyr e NCS

Existem diversas maneiras de se trabalhar com o Zephyr, e apresentarei aqui alguns métodos dessas opções.

A Nordic possui o nRF Connect SDK (NCS), que é o ambiente de desenvolvimento (SDK) da Nordic baseado em Zephyr. Recomendo ele para quem quer trabalhar com a plataforma nRF da Nordic, em especial as família nRF52 e N53 para BLE/Zigbee/Thread e a família nRF91 para LTE-M/NB-IoT/GPS.

Descrevo como instalar o Zephyr a partir do NCS no Método 1 (baseado em GUI, mais rápido) ou então no Método 2(a) (baseado em linha de comando).

Desta maneira, além do Zephyr, serão instalados os repositórios do nRF Connect SDK (NCS) que além de libs e exemplos específicos para os devices nRF, você tem acesso ao SoftDevice, que é o Link Layer Nordic otimizado para BLE, Zigbee, Thread e Bluetooth Mesh e também alguns serviços específicos como a nRFCloud.

O SoftDevice  possui alguns recursos interessantes como capacidade de multi-protocolos e um stack certificado periodicamente pela Nordic junto ao Bluetooth SIG.

Se você  deseja utilizar o Zephyr de maneira mais “pura”, ou então com outras plataformas de hardware, sugiro o Método 2(b), através de linha de comando. Nesse caso o Link Layer de Bluetooth será o OpenSource do próprio Zephyr.

Para rodar alguns exemplos no final, utilizarei o Visual Studio Code (VS Code). Para fins práticos considero que você já tem essa ferramenta instalada.

Se preferir, você pode também simplesmente utilizar o Zephyr direto dentro do PlatformIO no VS Code.

Método 1: Instalação através do Toolchain Manager do nRF Connect da Nordic

Este é o método mais simples e rápido para usar o Zephyr através do  nRF Connect SDK e ele também é válido para o Mac OS.

Será instalado o toolchain, os repositórios da Nordic, o repositório do Zephyr além do SEGGER Embedded Studio, que pode ser utilizado de maneira gratuita com os devices Nordic.

Primeiro você  precisa baixar e instalar o nRF Connect for Desktop de acordo com seu OS.

Com o nRF Connect instalado, você deve iniciar a instalação do Toolchain Manager e depois solicitar a instalação da versão desejada do SDK. 

Dica: antes de iniciar a instalação, vá em Setting e coloque o path de instalação para algo curso e sem espaços no nome, como c:\nrf ou c:\work\nrf.

O Toolchain Manager vai iniciar então o download e configuração de todos os repositórios necessários. Isso pode demorar um pouco dependendo de sua conexão.

Sugiro na parte inferior da tela clicar em “SHOW LOG” para acompanhar melhor a instalação.

Após feita a instalação pelo Toolchain Manager, você pode tanto clicar em “Open IDE” para abrir o SEGGER Embedded Studio, ou clicar na seta para baixo e selecionar  “Open command prompt” para abrir um CMD com todas as variáveis de ambiente já setadas para dar comandos west, ou a partir dali chamar “code” para abrir o seu Visual Studio Code  já com todas as variáveis de ambiente setadas.

Você pode agora ou pular diretamente para a seção onde mostro como rodar um exemplo usando o Visual Studio Code, ou então ler o Método 2 para entender mais sobre o Zephyr e west.

Método 2: Instalação através do west

O Zephyr, tanto na versão do NCS da Nordic quanto em sua versão “pura”, utiliza múltiplos repositórios em diferentes revisões. 

A revisão utilizada de cada um desses repositórios está presente num arquivo de manifesto chamado west.yml, localizado no repositório principal, chamado também de repositório do manifesto. Os demais repositórios utilizados são chamados repositórios de projeto.

Aqui você terá duas opções:

Método 2(a): SDK-NRF da Nordic como Repositório Principal

  • Utiliza como repositório principal o nrfconnect/sdk-nrf, o repositório do SDK da Nordic.
  • No seu manifesto west.yml referência entre outros, um fork da Nordic que é sincronizado com o diretório principal do Zephyr.
  • Esse é o método recomendado para trabalhar com a família nRF, pois utilizará as libs específicas da Nordic, incluindo o SoftDevice, que é o stack de BLE/Zigbee/Thread otimizado para os devices Nordic entre outros.

Método 2(b): Zephyr-Project como Repositório Principal

  • Utiliza como repositório principal o zephyrproject-rtos/zephyr, o repositório principal do Zephyr project.
  • O seu manifesto west.yml faz referência a diversas HALs.
  • Este é o método indicado para utilizar com outros fabricantes, ou se você quer testar funções novas ainda não estão presentes na versão do Zephyr sincronizada com o SDK Nordic.

Se você tem experiência com o GitHub e deseja poder contribuir para o Zephyr Project ou para o SDK da Nordic, a sugestão é realizar um fork do repositório desejado e então utilizar seu próprio fork para inicializar a instalação. Dessa maneira você vai poder criar seus branches com alterações e poder fazer pull requests para contribuir com os projetos.

Instalando os pré-requisitos

Independente do repositório a ser utilizado como principal, será necessário antes instalar alguns pré-requisitos e a própria ferramenta west.

Para o Windows, a forma recomendada de instalação  é através do gerenciador de pacotes Chocolatey. Para outros OS siga os passos deste link.

  1. Instalar o chocolatey.
  2. Abrir o cmd.exe como  Administrador. Para isso aperte a tecla do Windows, digite “cmd.exe” e clique no resultado com o botão direito e escolha “Executar como Administrador”.
  3. Desabilite as confirmações globais para não precisar ficar confirmando pacote a pacote:
choco feature enable -n allowGlobalConfirmation
  1. Depois use o comando choco para instalar as dependências:
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
choco install ninja gperf python git
  1. Agora instale o west:
pip3 install west
  1. Instale o GNU Arm Embedded Toolchain. Sugiro instalar em um path curto e sem espaços como c:/gnuarmemb
  2. Por último instale nRF Command Line Tools, que conterá a ferramenta nrfjprog, usada pelo west para programar a plataforma nRF.

Alternativamente instale o J-Link / J-Trace para outras plataformas.   

Garanta que o nrfjprog.exe ou o jlink.exe estejam nas variáveis de ambiente do PATH de seu sistema.

Utilizando o West Init

O comando de inicialização do west possui a seguinte sintaxe:

west init -m REPOSITORY_URL --mr REPOSITORY_branch (OPTIONAL_SUB_DIR)

Nele você aposta o endereço do repositório principal onde está o manifesto west.yml e também especifica qual a versão (branch) do repositório você quer utilizar.

Você também pode especificar um diretório que será criado para conter sua instalação. Útil quando você quer manter diversas versões do SDK ou do Zephyr instaladas.

Abra um terminal, por exemplo, o CMD,  crie um diretório para conter sua instalação (sugiro algo curto e sem espaços como C:\work\nrf ou C:\work\zephyr) e utilize o comando a seguir de acordo com o repositório utilizado (ou substitua pelo seu próprio fork):

Método 2(a): Repositório do SDK Nordic. (Utilize a revisão do SDK desejada):

west init -m https://github.com/nrfconnect/sdk-nrf --mr v1.6.1

Método 2(b): Repositório principal do Zephyr Project:

west init -m https://github.com/zephyrproject-rtos/zephyr.git --mr zephyr-v2.6.0

Caso deseje iniciar o branch “main” ao invés de algum branch específico, simplesmente omita o parâmetro --mr REPOSITORY_branch

Com isto você terá baixado o git do repositório principal do manifesto e estará pronto para popular os demais diretórios.

Utilizando o West Update

Agora o próximo passo é você dar o comando para fazer o clone dos demais repositórios, de acordo com o seu west.yml. Para isso simplesmente chame o comando:

west update

Aqui você verá a verdadeira magia do west acontecendo. Ele baixará todos os repositórios do manifesto. No fim você terá uma das estruturas abaixo:

Método 2(a): 

Directory of C:\Work\nrf\v1.6.0

22/08/2021  15:27    <DIR>          .
22/08/2021  15:27    <DIR>          ..
29/07/2021  13:52    <DIR>          .west
22/08/2021  15:22    <DIR>          bootloader
22/08/2021  15:25    <DIR>          mbedtls
22/08/2021  15:27    <DIR>          modules
29/07/2021  13:52    <DIR>          nrf
22/08/2021  15:22    <DIR>          nrfxlib
22/08/2021  15:24    <DIR>          test
22/08/2021  15:27    <DIR>          tools
22/08/2021  15:21    <DIR>          zephyr
              0 File(s)              0 bytes
              11 Dir(s)  245.946.970.112 bytes free

Método 2(b): Zephyr Project

Directory of C:\Work\zephyr

20/08/2021  10:19    <DIR>          .
20/08/2021  10:19    <DIR>          ..
19/08/2021  18:11    <DIR>          .west
20/08/2021  10:19    <DIR>          bootloader
20/08/2021  10:28    <DIR>          modules
20/08/2021  10:20    <DIR>          tools
20/08/2021  10:45    <DIR>          zephyr
              0 File(s)              0 bytes
              7 Dir(s)  245.950.586.880 bytes free

Perceba na primeira imagem os repositórios a mais usados pelo NCS: mbedtls, nrf, nrfxlib e test.

Destes, destaco o nrf que é o diretório principal do NCS e o nrfxlib com diversas libs específicas para Nordic.

Por último, execute o comando abaixo para exportar um pacote para o CMake automaticamente achar a sua instalação do Zephyr:

west zephyr-export

Ajustes Finais do Ambiente

Agora você precisará fazer alguns ajustes finais no ambiente.

Primeiro, instale algumas dependências com os comandos:

pip3 install -r zephyr/scripts/requirements.txt
pip3 install -r bootloader/mcuboot/scripts/requirements.txt

E se estiver usando o NCS:

pip3 install -r nrf/scripts/requirements.txt

Por último, o west precisa de duas variáveis de ambiente para achar o gnuarmemb:

set ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb
set GNUARMEMB_TOOLCHAIN_PATH=c:\gnuarmemb


Também é necessário definir onde está o código base do Zephyr, que deve apontar para onde está o repositório zephyr da sua instalação, por exemplo:

set ZEPHYR_BASE C:\nrf\zephyr


Você pode deixar essas variáveis de ambiente fixas no seu sistema para não precisar setar todas as vezes que for usar as ferramentas.

Executando seu primeiro exemplo no VS Code 

Se você chegou até aqui, considero que você fez a instalação do NCS ou do Zephyr através de um dos métodos descritos anteriormente, e está agora num prompt de comando (CMD) com todas as variáveis de ambiente corretamente setadas.

Se você ainda não executou “code” para abrir o Visual Studio Code, pode fazê-lo e depois vá em File / Open Folder (ou Arquivo / Abrir Pasta) para selecionar um exemplo. Sugiro começar pelo clássico: /zephyr/samples/basic/blinky

Na pasta: /zephyr/samples, você terá uma infinidade de exemplos adicionais genéricos do Zephyr. No caso do NCS, você adicionalmente terá na pasta /nrf/samples  exemplos específicos para a plataforma nRF e algumas aplicações alto nível prontas em: /nrf/applications.

Deixo como sugestão também algumas extensões úteis do VS Code para trabalhar com o Zephyr:

Agora vamos olhar a estrutura do projeto Blinky:

Por hora, observe que a estrutura é enxuta, não havendo qualquer menção a arquiteturas, especificação de pinos de placas ou  qualquer definição de periféricos.

O Zephyr utiliza o arquivo Kconfig prj.conf para definir o seu projeto e todos os módulos utilizados nele. O Blink tem um singelo arquivo de configuração com uma singela linha:

CONFIG_GPIO=y

Esta configuração CONFIG_GPIO=y diz para o Zephyr que se deseja utilizar o acesso a GPIOs.

O arquivo CMakeList.txt traz a lista de todos os fontes utilizados no projeto. Em nosso caso ele aponta para o ZEPHYR_BASE e o nosso main.c:

# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.13.1)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(blinky)

target_sources(app PRIVATE src/main.c)

Por hora, vamos nos atentar a um último arquivo, o main.c, que contém nossa aplicação principal, mas antes, sugiro criar um c_cpp_properties.json com o seguinte conteúdo para você poder usar o InteliSense nesse projeto:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "${ZEPHYR_BASE}/include/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:/gnuarmemb/bin/arm-none-eabi-gcc.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}

Com o InteliSense configurado, vamos olhar a função main:

void main(void)
{
    const struct device *dev;
    bool led_is_on = true;
    int ret;
 
    dev = device_get_binding(LED0);
    if (dev == NULL) {
        return;
    }
 
    ret = gpio_pin_configure(dev, PIN, GPIO_OUTPUT_ACTIVE | FLAGS);
    if (ret < 0) {
        return;
    }
 
    while (1) {
        gpio_pin_set(dev, PIN, (int)led_is_on);
        led_is_on = !led_is_on;
        k_msleep(SLEEP_TIME_MS);
    }
}

Perceba acima que o acesso ao led é definido pelo comando device_get_binding(LED0), é configurado pelo comando gpio_pin_configure(dev, …) para configurar o pino do LED0 e gpi_pin_set(…) para atribuir valor ao estado do LED0.

Observe que em lugar algum do projeto Blinky é definido qual é a arquitetura, qual o device ou em que pino o led está ligado.

Isso tudo é feito através dos arquivos de board files, que veremos em um artigo futuro.

Por hora, é importante saber que através do comando west build você especificará para qual placa você estará construindo o sistema, e através dos board files dessa placa o Zephyr identifica onde estará o periférico LED0 e saberá exatamente qual pino acessar.

Execute então o comando west build para começar a montar e compilar o projeto. No meu caso utilizei uma placa nRF52833-DK da Nordic, então meu comando de build foi:

west build -b nrf52833dk_nrf52833

Este comando criará uma pasta “build” com toda a implementação dentro dela. Caso prefira, você pode especificar o parâmetro: -d nome_diretório, para fazer o build em um diretório específico, muito útil quando se quer fazer build para múltiplas placas.

Para saber quais as placas com porte pronto para o Zephyr, você pode usar o comando west boards, ou então olhar em zephyr/boards. Para placas da Nordic, existe uma lista adicional de placas experimentais ou obsoletas em sdk-nrf/boards.

Rodado o west build com sucesso, você receberá a informação de quanta FLASH e RAM seu projeto está usando:

-- west build: building application
[137/144] Linking C executable zephyr\zephyr_prebuilt.elf

[144/144] Linking C executable zephyr\zephyr.elf
Memory region         Used Size  Region Size  %age Used
          FLASH:       17200 B       512 KB      3.28%
            SRAM:        5600 B       128 KB      4.27%
        IDT_LIST:          0 GB         2 KB      0.00%

Agora o seu projeto está pronto para ser programado. Se você está utilizando um programador J-Link ou então algum kit de desenvolvimento com J-Link integrado (como o nRF52833-DK) que estou utilizando, basta chamar o seguinte comando para programar a sua placa:

west flash

Se tudo ocorrer corretamente, você verá algo semelhante ao abaixo mostrando o sucesso da gravação:

-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner nrfjprog
Using board 683676942
-- runners.nrfjprog: Flashing file: C:\Work\zephyr\zephyr\samples\basic\blinky\build\zephyr\zephyr.hex
Parsing image file.
Erasing page at address 0x0.
Erasing page at address 0x1000.
Erasing page at address 0x2000.
Erasing page at address 0x3000.
Erasing page at address 0x4000.
Applying system reset.
Checking that the area to write is not protected.
Programming device.
Enabling pin reset.
Applying pin reset.
-- runners.nrfjprog: Board with serial number 683676942 flashed successfully.

Agora teoricamente você verá o led de sua placa piscando. Porém, algumas placas precisam de um reset adicional, como no caso da nRF52833-DK que estou utilizando

Para tal eu executo o comando abaixo e meu led começa a piscar:

nrfjprog --reset

Observações Finais

Espero que se você chegou até aqui, o seu led também esteja piscando corretamente e com isso o seu sistema para desenvolvimento com o Zephyr e/ou NCS esteja corretamente configurado.

Caso deseje utilizar o NCS com o Segger, sugiro a instalação pelo Método 1 citado e seguir esse link para rodar seu primeiro exemplo: Building and programming an application — nRF Connect SDK

West Flash com Bootloader / Bossac

Caso você esteja utilizando uma placa que tenha um bootloader para gravação, como no caso da Arduino 33 BLE Sense, você precisará utilizar a ferramenta bossac para gravação. 

No Windows será necessário instalar a Arduino IDE para poder utilizar o bossac.exe da instalação deste ambiente e é necessário fazer alguns ajustes manuais no Zephyr. 

Se for esse seu caso, deixe um comentário que revisarei este artigo com os detalhes. A comunidade está trabalhando para suportar o bossac no Windows sem necessidades de ajustes manuais, devendo estar disponível em um update futuro do Zephyr.

Zephyr RTOS + Nordic

Zephyr RTOS – Primeiro Projeto BLE: Monitor Cardíaco
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
Reinaldo
Reinaldo
02/11/2021 10:18

Olá,
É possível usar esse ambiente para programar uma placa MS50SFA1 ?

Home » Software » Zephyr RTOS – Instalando o Ambiente de Desenvolvimento

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: