Linux Embarcado IoT Hackday - Telefônica
O que é Linux Embarcado?
Diego Sueiro [email protected] @diegosueiro br.linkedin.com/in/diegosueiro Administrador do Embarcados Proprietário da ESD Tecnologia SOBRE ESTE DOCUMENTO
● Esta apresentação é baseada na Wikipedia, no material de Treinamento da Embedded Labworks ( e-labworks.com/treinamentos/linux/source) e no material de treinamento disponibilizado pela Free Electrons: http://free-electrons.com/doc/training/embedded-li nux
● Este documento é disponibilizado sob a Licença Creative Commons BY-SA 3.0. http://creativecommons.org/licenses/by-sa/3.0/legalco de SOBRE O PALESTRANTE
● Formado em 2006 em Eng. de Controle e Automação pela UNIFEI.
● É proprietário da ESD Tecnologia, onde atua com consultoria, desenvolvimento de software para sistemas embarcados: http://esdtec.net
● Administrador do Embarcados.com.br Introdução à Linux embarcado OS 3 MARCOS
● 1970: Engenheiros da Bell Labs, liderados por Ken Thompson e Dennis Ritchie, criam o sistema operacional UNIX.
● 1983: Richard Stallman, projeto GNU e o conceito de software livre. Começa o desenvolvimento do gcc, gdb, glibc e outras ferramentas importantes.
● 1991: Linus Torvalds, projeto do kernel Linux, um sistema operacional UNIX-like. Em conjunto com o projeto GNU, nasce o sistema operacional GNU/Linux. Em 1991...
”I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things.” 20 ANOS DEPOIS VÍDEOS
✗ Os 20 anos do Linux : linuxfoundation.org/20th vimeo.com/22030635
✗ How Linux is Built: vimeo.com/39711916 O KERNEL
● Linux é o kernel! http://www.kernel.org
● As distribuições Linux (Ubuntu, Fedora, Debian, Slackware, etc) integram o kernel Linux, bibliotecas e aplicações.
● O correto é chamar estas distribuições de sistemas operacionais GNU/Linux.
● Linux embarcado é o uso do kernel Linux e de diversos componentes open-source em sistemas embarcados. PRINCIPAIS CARACTERÍSTICAS
● Distribuições GNU/Linux seguem o LSB (Linux Standard Base) que é baseado na especificação POSIX (Portable Operating System Interface) do IEEE.
● Portabilidade para mais de 20 arquiteturas!
● Escalabilidade: o mesmo kernel roda em relógios, em celulares e em servidores da bolsa de valores!
● Livre de royalties.
● Roda em dispositivos com pouquíssimos recursos. PRINCIPAIS CARACTERÍSTICAS (cont.)
● Qualidade: Milhares de pessoas olhando e testando o código.
● Estabilidade: capaz de rodar por muito tempo sem precisar de um único reboot.
● Modularidade: capaz de rodar apenas o que é necessário para seu projeto.
● Multicore: suporta múltiplas CPU.
● Reuso de Componentes.
● Controle total sobre o código-fonte do teu produto. PRINCIPAIS CARACTERÍSTICAS (cont.)
● Suporte da Comunidade.
● Recursos ”infinitos” disponíveis na internet. MITOS
● Mito 1: ”Linux is Free”. – Linux não é grátis, Linux é livre! Do 2o. parágrafo da GPL: ”When we speak of free software, we are refering to freedom, not price”.
● Mito 2: ”Não consigo proteger a propriedade intelectual do meu produto”. – Consegue sim, basta tomar alguns cuidados com licenças de software! Arquitetura básica ARQUITETURA BÁSICA
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware COMPONENTES DO SISTEMA
● Hardware: seu produto!
● Bootloader: iniciado pelo hardware, responsável pela inicialização básica, carregamento e execução do kernel Linux. ● Kernel Linux: Núcleo do sistema operacional. Gerencia CPU, memória e I/O, exportando serviços para as aplicações do usuário.
● Rootfs: sistema de arquivos principal. – Biblioteca C: interface entre o kernel e as aplicações do usuário. – Bibliotecas e aplicações do usuário.
● Toolchain: conjunto de ferramentas para gerar os binários do sistema. HARDWARE
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware HARDWARE CPU
● Suporta mais de 25 arquiteturas diferentes (x86, ia64, ARM, PPC, MIPS, SuperH, Blackfin, Coldfire, etc).
● 32/64 bits: não foi feito para microcontroladores!
● Originalmente projetado para CPUs com MMU (Memory Management Unit).
● O projeto uClinux foi criado para que o Linux pudesse ser usado em CPUs sem MMU. http://www.uclinux.org/
● Mas boa parte do uClinux já foi integrado à árvore oficial do kernel, possibilitando o uso do Linux em diversas CPUs sem MMU (m68k e arm sem MMU, H8/300 da Hitachi, ADI Blackfin, etc). MEMÓRIA RAM
● Um sistema bem básico pode funcionar com até 8MB de RAM. DISPOSITIVOS DE ARMAZENAMENTO
● Suporta armazenamento em memória flash NAND ou NOR.
● Suporta dispositivos de armazenamento em bloco, incluindo discos e cartões SD/MMC.
● Um sistema bem básico pode funcionar com 2M de armazenamento (ou até menos!). COMUNICAÇÃO
● O Linux suporta muitos barramentos comuns em sistemas embarcados: I2C, SPI, CAN, 1-wire, SDIO, USB, etc.
● E também os principais protocolos de rede: Ethernet, Wi-Fi, Bluetooth, CAN, IPv4, IPv6, TCP, UDP, etc.
● Se o barramento ou protocolo não possuir restrições de licença, é bem provável que esteja implementado no kernel.
● Já protocolos ou barramentos com restrições de licença tem dificuldade para entrar na árvore oficial do kernel (Ex: Zigbee). CRITÉRIOS PARA SELEÇÃO
● Certifique-se de que o hardware já é suportado pelo Linux e por um bootloader open-source. ● Suporte nas versões oficiais dos projetos (kernel e bootloader) é bem melhor: maior qualidade e novas versões disponíveis. TOOLCHAIN
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware TOOLCHAIN
● Conjunto de ferramentas de programação usadas para gerar determinado produto, seja um software ou mesmo um sistema completo. ● Quando a plataforma de desenvolvimento (host) é diferente da plataforma alvo (target), chamamos o toolchain de cross- compiling toolchain. TOOLCHAIN (cont.)
Código-fonte Host Toolchain nativo Cross-compiling toolchain x86
Binário x86 Binário ARM Target x86 ARM COMPONENTES DO TOOLCHAIN
● Compilador (gcc).
● Assembler e Linker (binutils). ● Standard C Library (glibc, uclibc, dietlibc, etc). TOOLCHAINS PRONTOS
● GCC (GNU Compiler Collection): Suporte a 39 arquiteturas (de 8 a 64bits) http://gcc.gnu.org/
● Code Sourcery (ARM): http://www.codesourcery.com/gnu_toolchains /arm/ ● MIPS: http://www.linux-mips.org/wiki/Toolchains
● Linaro (ARM): https://wiki.linaro.org/WorkingGroups/ToolCha in SISTEMA LINUX EMBARCADO
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware SISTEMA LINUX EMBARCADO (NA FLASH)
Bootloader
Kernel
Rootfs
Memória flash BOOTLOADER
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware BOOTLOADER
● Todo hardware possui um mecanismo de inicialização, que é responsável por carregar e executar o bootloader.
● O bootloader é responsável por carregar e executar o kernel do sistema operacional (no nosso caso, o Linux). FUNCIONALIDADES DO BOOTLOADER
● Inicializar o hardware antes de executar o kernel, como por exemplo configurar a controladora de SDRAM.
● Passar parâmetros para o kernel.
● Prover mecanismos para carregar e gravar o kernel e o sistema de arquivos na memória flash ou cartão SD.
● Inicializar via rede ou pelo cartão SD.
● Rotinas de diagnóstico de hardware. PRINCIPAIS BOOTLOADERS
● x86: – LILO – Grub
● ARM, MIPS, PPC e outras arquiteturas: – U-Boot – Barebox – Redboot KERNEL
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware INICIALIZAÇÃO BÁSICA
● Inicializa CPU, memória e barramentos.
● Configura a memória virtual (se tiver MMU).
● Inicializa os device drivers.
● Inicia o escalonador de tarefas.
● Inicia threads do kernel.
● Monta sistema de arquivos principal (rootfs) e chama o processo init. CARACTERÍSTICAS DO KERNEL
● Gerencia execução de processos e controla acesso à memória e I/O.
● Conceito de kernel space x user space.
● Interface de user space com kernel space via chamadas do sistema (system calls).
● Acesso ao hardware via arquivos de dispositivo.
● Gerenciamento dinâmico dos módulos do kernel. EXEMPLO DE SYSTEM CALL ROOTFS
Biblioteca Biblioteca
Biblioteca Biblioteca
Toolchain Biblioteca C
Linux kernel
Bootloader
Hardware COMPONENTES BÁSICOS
● Biblioteca do sistema (uClibc, glibc, eglibc, dietlibc, etc).
● Mecanismo de inicialização. ● Bibliotecas e aplicações. APLICAÇÕES PARA EMBARCADOS
● Dropbear: cliente e servidor SSH (~110K).
● Thttpd: servidor web (~88K). ● DirectFB: biblioteca gráfica (~1,4MB).
● SQLite: Banco de dados (~250KB). BUSYBOX
● O canivete suíço de sistemas embarcados com Linux!
● Combina versões mais leves de ferramentas UNIX em um único binário, otimizado por tamanho.
● Geralmente as ferramentas são mais limitadas em termos de funcionalidades comparadas às originais. SISTEMA LINUX
“Desenvolver um sistema Linux embarcado é como brincar de Lego!” BUILD SYSTEM
● Um build system é capaz de: – Gerar o toolchain. – Compilar e gerar a imagem do bootloader. – Configurar, compilar e gerar a imagem do kernel. – Configurar, compilar bibliotecas e aplicações, e gerar a imagem final do rootfs. ALGUNS BUILD SYSTEMS
● Proprietários: – Monta Vista. – Wind River. – TimeSys.
● Open source: – Buildroot. – OpenEmbedded / Yocto. – PTXdist. – LTIB. PLACAS DE DESENVOLVIMENTO
Raspberry Pi (USD 25/35): http://www.raspberrypi.org/
– CPU - ARM11 700 Mhz – Broadcom BCM2835 – RAM - 256MB / 512MB – MMC Slot – USB – 1 / 2 – HDMI e Video Composto – Saída de Audio no conector de 3.5mm – Ethernet (no modelo B) – Barra de Pinos com expansão de I/Os do processador PLACAS DE DESENVOLVIMENTO
BeagleBone Black (USD 55): http://beagleboard.org/
– CPU – ARM Cortex-A8 1 Ghz – Texas Instruments AM335x – RAM – 512MB – eMMC - 4GB – uMMC Slot – 1 USB Host e 1 USB Device – HDMI – Ethernet – Conectores com expansão de I/Os do processador OS 3 PAPÉIS DO DESENVOLVEDOR
● Desenvolvedor de aplicações: desenvolve aplicações Linux.
● Desenvolvedor de BSP (Board Support Package): porta o kernel e o bootloader, desenvolve os device drivers para os dispositivos de hardware usados no produto, etc.
● Integrador: Integra todos os componentes (bootloader, kernel, bibliotecas e aplicações) em um sistema Linux embarcado. COMO SE TORNAR UM DESENVOLVEDOR
● Inglês
● Hardware: Análise de Esquemáticos e Data Sheets
● Usuário Avançado de linha de comando de Distros GNU/Linux
● Programação em Assembly (Básico), C (Avançado) e Shell Script
● Livros: – Linux Kernel Development – Linux Device Drivers – The Linux Programming Interface
● Ter uma placa de desenvolvimento
● Use e abuse do Oráculo Perguntas e Respostas
? OBRIGADO PELA PRESENÇA [email protected] www.embarcados.com.br www.esdtec.net Google Grupos sis_embarcados