sexta-feira, 29 de março de 2019

Programando u-blox NINA-B302 com o RTOS Zephyr



O objetivo deste BLOG é demonstrar de forma resumida como é possível fazer com que o módulo NINA B302 possa rodar o RTOS Zephry. Foi utilizado o módulo NINA-B3 para o teste.


Sobre RTOS Zephyr

O sistema operacional Zephyr é baseado em um kernel de pequena dimensão projetado para uso em sistemas com recursos restritos e embarcados: de sensores ambientais incorporados simples e wearables de LED a sofisticados controladores embarcados, relógios inteligentes e aplicativos sem fio IoT.

O Projeto Zephyr RTOS é um esforço recente da Fundação Linux para fornecer ao mundo embarcado um Sistema Operacional em Tempo Real gratuito, seguro e completo. Ele foi projetado desde o início para ser um RTOS moderno, escalável, seguro e responsivo com um foco claro em protocolos e fundações de IoT. Este RTOS de código aberto é licenciado pelo Apache 2.0 e possui um modelo de desenvolvimento totalmente aberto

Recentemente, a Nordic contribuiu com portas para todos os CIs baseados em Cortex-M (nRF51, nRF52832  (NINA B1) e nRF52840 (NINA B3), bem como um Controlador BLE de fonte aberta (Link Layer + HCI) totalmente funcional, altamente otimizado para a família de ICs nRF5x. Isto significa que você pode clonar, construir e executar o Zephyr hoje e aproveitar todos os recursos que ele permite, incluindo muitos perfis BLE padrão, IPv6 sobre BLE e um conjunto rico de APIs e funcionalidades que se esperaria de um RTOS moderno. Além disso, todas as linhas de código, incluindo o Host e o Controlador BLE, são totalmente de código aberto, permitindo que você modifique e modifique seu comportamento ou até mesmo estenda isso à vontade. Você pode até mesmo construir seu próprio controlador e depois usá-lo para controlá-lo de uma pilha Host externa ou executar o resto do RTOS em seu computador usando o QEMU!

Características


O Zephyr oferece um grande e crescente número de recursos, incluindo:

Extenso conjunto de serviços do kernel

A Zephyr oferece vários serviços familiares para desenvolvimento:

Serviços de multiencadeamento para encadeamentos cooperativos, com base em prioridade, não preemptivos e preemptivos, com fatiamento de tempo round-robin opcional. Inclui suporte à API compatível com POSIX pthreads.
Serviços de interrupção para registro em tempo de compilação de manipuladores de interrupção.
Serviços de alocação de memória para alocação dinâmica e liberação de blocos de memória de tamanho fixo ou variável.
Serviços de Sincronização Inter-thread para semáforos binários, semáforos de contagem e semáforos mutex.
Serviços de transmissão de dados entre threads para filas de mensagens básicas, filas de mensagens aprimoradas e fluxos de bytes.
Serviços de gerenciamento de energia, como inatividade sem marcas e uma infraestrutura avançada inativa.

Algoritmos de Agendamento Múltiplos

O Zephyr fornece um conjunto abrangente de opções de agendamento de threads:

Programação Cooperativa e Preemptiva
Primeiro Prazo Primeiro (EDF)
Programação de meta-IRQ implementando o comportamento “interromper a metade inferior” ou “tarefa”
Timeslicing: permite a divisão de tempo entre encadeamentos preemptivos de prioridade igual
Várias estratégias de enfileiramento:
Fila pronta de lista vinculada simples
Fila pronta de árvore vermelha / preta
Fila pronta multi-fila tradicional

Altamente configurável / modular para flexibilidade

Permite que um aplicativo incorpore somente os recursos de que precisa, conforme necessário, e especifique sua quantidade e tamanho.

Arquitetura Cruzada

Suporta uma ampla variedade de placas suportadas com diferentes arquiteturas de CPU e ferramentas de desenvolvedor. Contribuições adicionaram suporte para um número crescente de SoCs, plataformas e drivers.

Proteção de Memória

Implementa proteção de estouro de pilha específica para arquitetura configurável, rastreamento de permissão de objeto de kernel e driver de dispositivo e isolamento de thread com proteção de memória em nível de encadeamento em arquiteturas x86, ARC e ARM, espaço de usuário e domínios de memória.

Para plataformas sem MMU / MPU e dispositivos com memória restrita, suporta a combinação de código específico de aplicativo com um kernel personalizado para criar uma imagem monolítica que seja carregada e executada no hardware de um sistema. Tanto o código do aplicativo quanto o código do kernel são executados em um único espaço de endereçamento compartilhado.

Definição de Recurso em Tempo de Compilação

Permite que os recursos do sistema sejam definidos em tempo de compilação, o que reduz o tamanho do código e aumenta o desempenho de sistemas com recursos limitados.

Modelo de driver de dispositivo otimizado

Fornece um modelo de dispositivo consistente para configurar os drivers que fazem parte da plataforma / sistema e um modelo consistente para inicializar todos os drivers configurados no sistema e permite a reutilização de drivers em plataformas que possuem dispositivos comuns / bloqueios de IP

Suporte a árvore de dispositivos

Uso de Device Tree (DTS) para descrever informações de hardware e configuração para placas. As informações do DTS serão usadas somente durante o tempo de compilação. Informações sobre o sistema são extraídas do DTS compilado e usadas para criar a imagem do aplicativo.

Rede Nativa Stack suportando vários protocolos

O suporte de rede é totalmente caracterizado e otimizado, incluindo suporte compatível com sockets LwM2M e BSD. O suporte a OpenThread (em chipsets nórdicos) também é fornecido - uma rede em malha projetada para conectar de forma segura e confiável centenas de produtos ao redor da casa.

Suporte para Bluetooth Low Energy 5.0


Compatível com Bluetooth 5.0 (ESR10) e suporte a controlador de baixa energia Bluetooth (LE Link Layer). Inclui BLE Mesh e um controlador BLE pronto para qualificação Bluetooth.

Perfil genérico de acesso (GAP) com todas as funções possíveis de LE.
GATT (Perfil de Atributo Genérico)
Suporte de emparelhamento, incluindo o recurso Conexões seguras do Bluetooth 4.2
Limpar a abstração do driver de HCI
Interface HCI bruta para executar o Zephyr como um Controlador em vez de uma pilha Host completa
Verificado com vários controladores populares
Altamente configurável

Suporte de malha (MESH)

Recursos de relé, nó de amigo, nó de baixa potência (LPN) e proxy do GATT
Ambos os portadores de provisionamento suportados (PB-ADV e PB-GATT)
Altamente configurável, encaixando em dispositivos com pelo menos 16k de RAM

Linux nativo, macOS e Windows Development


Um ambiente de compilação CMake de linha de comando é executado em sistemas populares de sistemas operacionais de desenvolvedores. Uma porta POSIX nativa, permite criar e executar o Zephyr como um aplicativo nativo no Linux e em outros sistemas operacionais, auxiliando no desenvolvimento e nos testes.

Interface de sistema de arquivos virtual com suporte a NFFS e FATFS

Sistema de arquivos Flash Newtron (NFFS) e suporte a FATFS, FCB (Flash Circular Buffer) para aplicativos com restrições de memória e aprimoramentos do sistema de arquivos para criação de log e configuração.

Estrutura poderosa de log de vários back-ends

Suporte para filtragem de log, despejo de objetos, modo de pânico, múltiplos backends (memória, rede, sistema de arquivos, console, ..) e integração com o subsistema shell.

Interface amigável e cheia de recursos do Shell

Um subsistema de shell de várias instâncias com recursos fáceis de usar, como autocompletar, curingas, coloração, metacarys (setas, backspace, ctrl + u, etc.) e histórico. Suporte para comandos estáticos e subcomandos dinâmicos.


Configurações no armazenamento não volátil

O subsistema de configurações fornece aos módulos uma maneira de armazenar a configuração persistente por dispositivo e o estado de tempo de execução. Os itens de configurações são armazenados como sequências de pares de valores-chave.

Armazenamento não volátil (NVS)

O NVS permite o armazenamento de blobs binários, strings, inteiros, longs e qualquer combinação destes.

Porta POSIX nativa



Suporta rodar o Zephyr como um aplicativo Linux com suporte para vários subsistemas e redes.


Resumo de Instalação (LINUX UBUNTU)


A seguir, serão apresentados as sequências de passos para instalação do Zephyr para o NINA B1 com algumas dicas importantes. Para maiores detalhes, consulte o site do Zephy

Atualize o LINUX
$ sudo apt-get update
$ sudo apt-get install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-pip python3-setuptools python3-wheel xz-utils file make gcc \
  gcc-multilib
Instale o cmake

$ pip3 install --user cmake

Instale o dtc

$ git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git -b v1.4.6
$ cd dtc/
$ make
$ export PATH=$HOME/dtc/:$PATH

No arquivo host-tools.cmake
mudar dtc para 1.4.5, apesar de estar instalado 1.4.6, mas cmake nao detectou como 1.4.6

Obter e instalar um conjunto de ferramentas. Os seguintes toolchains são suportados:

Linux: Zephyr SDK, GNU ARM Embedded
macOS: GNU ARM Embedded

Assumindo que vamos com o GNU ARM Embedded e que você tenha um compilador nativo funcional e um conjunto de ferramentas básico em sua máquina, você pode seguir os passos abaixo:

Baixe e descompacte o GNU ARM Embedded na pasta de sua escolha. Neste manual vamos supor que você tenha descompactado em ~ / gccarmemb /

Exporte as seguintes variáveis ​​de ambiente:

$ export GNUARMEMB_TOOLCHAIN_PATH="~/gccarmemb/"
$ export ZEPHYR_TOOLCHAIN_VARIANT=gccarmemb

Clone o repositório para obter o código-fonte do Zephyr:

$ git clone https://github.com/zephyrproject-rtos/zephyr.git

Na pasta raiz do seu repositório recentemente clonado, execute:

$ source zephyr-env.sh

Agora você está pronto para construir. Vamos começar com um exemplo simples de BEACON

$ cd samples/bluetooth/beacon
$ mkdir build && cd build
$ cmake -DBOARD=nrf52_pca10040 ..
$ make

Para fazer o flash da imagem na placa, você precisará baixar e instalar o Pacote de Documentação e Software JLink e as ferramentas de linha de comando nRF5x. Informações adicionais sobre o Segger J-Link em placas Nordic nRF5x podem ser encontradas na página do documento Nordic nRF5x Segger J-Link

Agora você está pronto para usar o nrfjprog para apagar e programar o quadro:

$ nrfjprog --eraseall -f nrf52
$ nrfjprog - programa outdir /nrf52_pca10040/zephyr.hex -f nrf52
$ nrfjprog --reset -f nrf52
ou simplesmente

$ make flash

Código fonte (Eddystone)

/* main.c - Application main entry point */

/*
 * Copyright (c) 2015-2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/types.h>
#include <stddef.h>
#include <misc/printk.h>
#include <misc/util.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>

#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)

/*
 * Set Advertisement data. Based on the Eddystone specification:
 * https://github.com/google/eddystone/blob/master/protocol-specification.md
 * https://github.com/google/eddystone/tree/master/eddystone-url
 */
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR),
BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0xaa, 0xfe),
BT_DATA_BYTES(BT_DATA_SVC_DATA16,
       0xaa, 0xfe, /* Eddystone UUID */
       0x10, /* Eddystone-URL frame type */
       0x00, /* Calibrated Tx power at 0m */
       0x00, /* URL Scheme Prefix http://www. */
       'z', 'e', 'p', 'h', 'y', 'r',
       'p', 'r', 'o', 'j', 'e', 'c', 't',
       0x08) /* .org */
};

/* Set Scan Response data */
static const struct bt_data sd[] = {
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
};

static void bt_ready(int err)
{
if (err) {
 printk("Bluetooth init failed (err %d)\n", err);
 return;
}

printk("Bluetooth initialized\n");

/* Start advertising */
err = bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad),
        sd, ARRAY_SIZE(sd));
if (err) {
 printk("Advertising failed to start (err %d)\n", err);
 return;
}

printk("Beacon started\n");
}

void main(void)
{
int err;

printk("Starting Beacon Demo\n");
/* Initialize the Bluetooth Subsystem */
err = bt_enable(bt_ready);
if (err) {
 printk("Bluetooth init failed (err %d)\n", err);
}
}

Circuito


Execução


Abra o aplicativo BLE SCANNER e procure pelo módulo NINA B3





O link abaixo é muito interessante!

https://electronut.in/getting-started-with-zephyr-rtos-on-nordic-nrf52832-hackable/

Mais um ótimo LINK (Mohammad Afaneh)

ZEPHYR

Suporte: suporte@smartcore.com.br

Fontes: