tdc2016sp - trilha embarcados
TRANSCRIPT
Globalcode – Open4education
Globalcode – Open4education
Embarcados – Zephyr o sistema operacional de tempo real da Linux Foundation
Felipe Silva Neves
Globalcode – Open4education
Agenda:Zephyr, visão geral e motivações;
Aquitetura do kernel:Estrutura de diretórios;O nanokernel;O microkernel;
Introdução ao sistema de build:Obtendo o kernel;O utilitário menuconfig;A estrutura do diretório da aplicação;
Globalcode – Open4education
Agenda cont.:Demo: “Placa Freedom K64F, blink LED”;
Kernel object basics:Threads e fibers;Sincronismo com semáforos;Mensagens entre threads (Queues);
Modelo de device drivers:O device model;Demo: “Driver I2C comunicando com acelerômetro”;
Conclusão.
Globalcode – Open4education
Zephyr, visão geral:
Desenvolvido a partir da seguinte parceria:
Globalcode – Open4education
Zephyr, visão geral:Sistema operacional de tempo real;
Direcionado a dispositivos com restrições de memória e processamento;
Escalável, footprint de memória ajustável;
Portável para multiplas arquiteturas;
Código aberto, manutenção por parceiros e comunidade.
Globalcode – Open4education
Zephyr, motivações:Kernel de tempo real para dispositivos como microcontroladores;
Foco em aplicações voltada para internet das coisas (IoT);
Desenvolvimento de melhorias facilmente implementadas pelo usuário;
Reaproveitamento de ferramentas já existentes;
Normalização de sistema operacional embarcado;
Projeto colaborativo.
Globalcode – Open4education
Aquitetura do kernel:O Zephyr é um projeto completo em termos de sistema operacional embarcado:
Globalcode – Open4education
Estrutura de diretórios:O Zephyr possui a organização própria dos diretórios do kernel:
Globalcode – Open4education
O nanokernel:Suporta dois contextos de execução: Fibers e ISR;
Scheduling cooperativo;
Kernel objects elementáres: LiFo; FiFo; Pilhas; Semáforos; Timers.
Menor footprint de memória possível, chegando a 8KB;
Uso em tarefas de altíssima prioridade e que precisam de desempenho.
Globalcode – Open4education
O microkernel:Possui um terceiro contexto de execução: Task (ou Threads);
Scheduling preemptivo;
Serviços mais complexos e poderosos:Queues;Mutexes (protegidos contra race-condition e inversão de prioridade);Eventos;Mailboxes;
Permite o uso de todos os serviços do nanokernel;
Maior footprint de memória podendo chegar a 512KB.
Globalcode – Open4education
O sistema de build:O zephyr possui seu próprio sistema de build;
Toda infraestrutura (toolchains, binutils) são providas pelo kernel;
O uso de uma toolchain nova pode ser adicionado;
Toda a configuração do kernel é feita através de um menu de configuração;
O kernel (bem como as toolchains) estão disponíveis para:Windows, Linux e Mac;Possibilidade de construir a própria toolchain;
Globalcode – Open4education
Obtendo o kernel:Pode ser obtido diretamente da página de downloads:
https://www.zephyrproject.org/downloads
O kernel é versionado utilizando git;
Assim uma forma alternativa de obter é clonando o repositório:git clone https://gerrit.zephyrproject.org/r/zephyr
Globalcode – Open4education
O utilitário menuconfig:O Zephyr é um kernel altamente configurável;
Configurar todas as opções do kernel através do código seria cansativo;
O Zephyr então gera toda a infraestrutura de build através do conhecido menuconfig:
Globalcode – Open4education
O utilitário menuconfig:
Globalcode – Open4education
O diretório da aplicação:Assim como o diretório do kernel, o zephyr possui um padrão para o diretório de aplicação:
Globalcode – Open4education
Demonstração de app:Nessa demonstração vamos configurar uma aplicação com LED RGB;
O hardware alvo utilizado: Freedom Board K64 da NXP;
A aplicação usa o Zephyr no modo microkernel e cria 3 threads;
Cada thread abre o device driver de GPIO e manipula o led correspondente;
Globalcode – Open4education
Kernel object basics:Como todo bom sistema de tempo real o zephyr oferece uma gama de serviços (kernel objects);
Alocação de objetos pode ser pública: arquivo .mdef;
Ou privada utilizando a macro: DEFINE_XXX(name);
Kernel objects do nanokernel só podem ser alocados de forma privada.
Globalcode – Open4education
Threads e fibers:O Serviço de kernel mais elementar;
Threads:Preemptivo;Execução opcional em round-robin;Executa sempre a de maior prioridade primeiro (exceto em caso de fiber ou ISR pronta).
Fibers:Cooperativo;
Possui sistemas de prioridade; Como não possui preempção, fiber controla quando deve suspender; Executa a de maior prioridade sempre( exceto em caso de ISR pronta).
• Alocação estática ou em runtime.
Globalcode – Open4education
Threads e fibers:• Alocação de objeto através do arquivo .mdef:
Globalcode – Open4education
Sincronismo com semáforos:
• Úteis para gerenciamento de recursos compartilhados;• Sincroniza tarefas de diferentes prioridades;
• sema / nano_sema: Iguais em funcionalidade; Totalmente configuráveis; Inicialização configurável.
• Alocação estática, ou, em runtime.
Globalcode – Open4education
Sincronismo com semáforos:
• Alocando através do arquivo .mdef:
Globalcode – Open4education
Mensagens entre threads (Mailboxes):
• Mesmo que independentes, comumente tasks precisam se comunicar;
• O zephyr oferece vários recursos de messaging;
• Queue ou Mailbox: Altamente configurável; Possui recurso de execução ISR safe;
• Alocação também de forma estática ou em runtime.
Globalcode – Open4education
Mensagens entre threads (Queues):
• Alocação pública, via arquivo .mdef:
• Queues possuem uma particularidade, o message descriptor :
Globalcode – Open4education
Modelo de device drivers:• De forma similar ao Linux, o Zephyr possui sua “userland”;
• Utilizada para comunicação com hardware da SoC;
• Controlam o acesso ao hardware e a área de memória crítica;
• Oferece chamadas síncronas;
• O modelo de device é uniforme e independente do tipo de driver.
Globalcode – Open4education
O device model:• O modelo de device do zephyr está todo contido no arquivo device.h
• Diferentes devices, mesmo device model:
Globalcode – Open4education
O device model:• Utilizando um device driver:
Globalcode – Open4education
Demo: “Driver I2C comunicando com acelerômetro”;
• O driver pode ser configurado ou não no menuconfig;
• Demonstraremos o poder das chamadas síncronas;
• Cada thread irá ler uma coordenada do acelerômetro;
• Todas usam o mesmo driver, porém o kernel se encarrega do sincronismo;
• Driver não disponível, bloqueia a thread até ficar livre.
Globalcode – Open4education
Conclusão:• O Zephyr é uma alternativa ao Linux para execução em tempo real;
• Muito dos conceitos do irmão maior são aproveitados;
• Sua alta configurabilidade o torna uma opção para diferentes SoCs;
• IoT friendly, mas não apenas limitada a essa aplicação;
• O Zephyr está em constante desenvolvimento;
Globalcode – Open4education
Conclusão:• Mais informaçoes sobre o projeto:
https://www.zephyrproject.org https://www.zephyrproject.org/doc/
Globalcode – Open4education
Obrigado!