O documento apresenta o sistema operacional Zephyr, desenvolvido para dispositivos embarcados. É descrito como o Zephyr oferece um kernel de tempo real leve e escalável através de sua arquitetura de nanokernel e microkernel. Além disso, são demonstrados recursos como threads, sincronismo, drivers de dispositivos e como configurar e compilar aplicações para rodar no Zephyr.
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
TDC2016SP - Trilha Embarcados
1. Globalcode – Open4educationGlobalcode – Open4education
Embarcados – Zephyr o sistema operacional de
tempo real da Linux Foundation
Felipe Silva Neves
2. 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;
3. 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.
5. 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.
6. 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.
9. 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.
10. 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.
11. 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;
12. 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
13. 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:
15. 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:
16. 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;
17. 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.
18. 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.
22. 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.
23. Globalcode – Open4education
Mensagens entre
threads (Queues):
• Alocação pública, via arquivo .mdef:
• Queues possuem uma particularidade, o message descriptor :
24. 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.
25. Globalcode – Open4education
O device model:
• O modelo de device do zephyr está todo contido no arquivo device.h
• Diferentes devices, mesmo device model:
27. 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.
28. 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;