Zephyr RTOS – Instalando o Ambiente de Desenvolvimento

Neste primeiro artigo de uma série sobre o Zephyr vou explicar como preparar seu sistema como preparar seu sistema para este RTOS e executar um rápido exemplo para validar a sua instalação.
Este post faz parte da série Zephyr RTOS + Nordic. Leia também os outros posts da série:

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. 

image 8

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.

image 9

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.

image 10

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.

image 11

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:
  1. Depois use o comando choco para instalar as dependências:
  1. Agora instale o 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:

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):

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

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:

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): 

Método 2(b): Zephyr Project

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:

Ajustes Finais do Ambiente

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

Primeiro, instale algumas dependências com os comandos:

E se estiver usando o NCS:

Por último, o west precisa de duas variáveis de ambiente para achar o 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:


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:

image 12

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:

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:

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:

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

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:

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:

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:

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

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:

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.

Outros artigos da série

Zephyr RTOS – Primeiro Projeto BLE: Monitor Cardíaco >>

João Dullius é Engenheiro de Aplicações na BP&M desde 2013, atuando atualmente com foco em em aplicações IoT, Machine Learning e RF. Engenheiro eletricista de formação, trabalhou em diversos projetos embarcados na área de telecomunicações e automação industrial e agrícola.

Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments

WEBINAR

Imagens de Ultrassom: Princípios e Aplicações

DATA: 26/10 ÀS 19:30 H