Olá pessoal, eu escrevi um post sobre o Zephyr, o RTOS para IoT desenvolvido pela Linux Foundation, há alguns dias e nesse post vou mostrar como instalar esse Sistema Operacional no Linux e utilizar o simulador para rodar um hello-world.
Em um terminal do Linux, crie uma pasta que preferir, entre nela e clone o Git do projeto. No meu caso fiz tudo na raiz.
sudo apt-get install git
cd ~/ git clone https://gerrit.zephyrproject.org/r/zephyr zephyr-project
Uma pasta zephyr-project será criada nesse diretório. Verifique com o comando:
ls -la
Instale as dependências:
sudo apt-get install make gcc gcc-multilib g++ libc6-dev-i386 g++-multilib python3-ply
Depois atualize todos os pacotes utilizando o comando apt-get update:
sudo apt-get update
Entre na pasta do Zephyr e utilize o comando source:
cd zephyr-project source zephyr-env.sh
É necessário baixar o arquivo zephyr-sdk-<version>-i686-setup.run para a arquitetura i686. Para descobrir a versão mais atual, entre neste site e veja qual é a versão que está sendo utilizada com o número mais atual.
wget https://nexus.zephyrproject.org/content/repositories/releases/org/zephyrproject/zephyr-sdk/<version>-i686/zephyr-sdk-<version>-i686-setup.run
Ou seja, para a versão 0.7.5:
wget https://nexus.zephyrproject.org/content/repositories/releases/org/zephyrproject/zephyr-sdk/0.7.5-i686/zephyr-sdk-0.7.5-i686-setup.run
Aguarde enquanto a instalação prossegue. O arquivo é grande. Tenha paciência. Você deve ver o seguinte no terminal:
Resolving nexus.zephyrproject.org (nexus.zephyrproject.org)... 199.19.213.246 Connecting to nexus.zephyrproject.org (nexus.zephyrproject.org)|199.19.213.246|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 308466774 (294M) [application/octet-stream] Saving to: ‘zephyr-sdk-0.7.5-i686-setup.run.1’ zephyr-sdk-0.7.5-i686-setup.run.1 100%[===========================================================================================================================================>] 294.18M 1.37MB/s in 2m 59s 2016-05-10 17:18:09 (1.64 MB/s) - ‘zephyr-sdk-0.7.5-i686-setup.run.1’ saved [308466774/308466774]
É necessario instalar o arquivo que acabou de baixar. Altere primeiramente as permissões:
sudo chmod 755 zephyr-sdk-<version>-i686-setup.run
Ou seja, para a versão 0.7.5:
sudo chmod 755 zephyr-sdk-0.7.5-i686-setup.run
E então instale:
sudo ./zephyr-sdk-<version>-i686-setup.run
Ou seja, para a versão 0.7.5:
sudo ./zephyr-sdk-0.7.5-i686-setup.run
Durante a instalação, vai pedir o diretório em qual deseja instalar, por padrão deixe vazio, O local da instalação sera /opt/zephyr-sdk/ (guarde esse local).
Você deve ver o seguinte no terminal:
Creating directory /opt/zephyr-sdk Success [*] Installing x86 tools... [*] Installing arm tools... [*] Installing arc tools... [*] Installing iamcu tools... [*] Installing mips tools... [*] Installing additional host tools... Success installing SDK. SDK is ready to be used.
Exporte as variáveis para que o build system do zephyr consiga encontrá-las. Para isso, digite no terminal:
export ZEPHYR_GCC_VARIANT=zephyr export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk export ZEPHYR_BASE=<diretorio onde esta a pasta que voce clonou>
Para esse projeto:
export ZEPHYR_GCC_VARIANT=zephyr export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk export ZEPHYR_BASE=~/zephyr-project/
Opcionalmente você pode executar o seguinte comando para que consiga usar o Zephyr em futuras sessões sem ter que repetir os passos de exportação:
cat <<EOF> ~/.profile export ZEPHYR_GCC_VARIANT=zephyr export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk export ZEPHYR_BASE=<diretorio onde esta a pasta que voce clonou> EOF
Para esse projeto:
cat <<EOF> ~/.profile export ZEPHYR_GCC_VARIANT=zephyr export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk export ZEPHYR_BASE=~/zephyr-project/ EOF
Para verificar o conteúdo desse arquivo, ~/.profile, pode-se acessa-lo via gedit, por exemplo:
gedit ~/.profile
Uma vez instalado, você já pode navegar pelos samples e testar aplicações no simulador, para tal acesse de dentro da pasta do zephyr.
Para a versão 0.7.5, entre na pasta:
cd samples/hello_wolrd/microkernel
Para rodar o hello word não é necessário alterar nada, dentro da mesma pasta corrente. Vamos compilar e rodar nosso primeiro hello wolrd:
make BOARD=qemu_x86 qemu
Ou simplesmente:
make qemu
E você deve ter algo assim no terminal:
Using /home/thiago/zephyr-project//boards/qemu_x86/qemu_x86_defconfig as base Merging /home/thiago/zephyr-project//kernel/configs/micro.config Merging prj.conf # # configuration written to .config # make[1]: Entering directory '/home/thiago/zephyr-project' make[2]: Entering directory '/home/thiago/zephyr-project/samples/hello_world/microkernel/outdir' GEN ./Makefile scripts/kconfig/conf --silentoldconfig Kconfig Using /home/thiago/zephyr-project as source for kernel GEN ./Makefile CHK include/generated/version.h UPD include/generated/version.h HOSTCC scripts/gen_idt/gen_idt.o HOSTLD scripts/gen_idt/gen_idt CHK misc/generated/configs.c UPD misc/generated/configs.c CHK include/generated/offsets.h UPD include/generated/offsets.h CHK misc/generated/sysgen/prj.mdef UPD misc/generated/sysgen/prj.mdef LD lib/libc/minimal/source/stdlib/built-in.o CC lib/libc/minimal/source/stdout/fprintf.o CC lib/libc/minimal/source/stdout/prf.o CC lib/libc/minimal/source/stdout/sprintf.o CC lib/libc/minimal/source/stdout/stdout_console.o LD lib/libc/minimal/source/stdout/built-in.o CC lib/libc/minimal/source/string/string.o LD lib/libc/minimal/source/string/built-in.o LD lib/libc/minimal/source/built-in.o LD lib/libc/minimal/built-in.o LD lib/libc/built-in.o LD lib/built-in.o CC kernel/microkernel/k_task.o CC kernel/microkernel/k_idle.o CC kernel/microkernel/k_init.o CC kernel/microkernel/k_command_packet.o CC kernel/microkernel/k_move_data.o CC kernel/microkernel/k_ticker.o CC kernel/microkernel/k_memory_map.o CC kernel/microkernel/k_memory_pool.o CC kernel/microkernel/k_irq.o CC kernel/microkernel/k_nop.o CC kernel/microkernel/k_offload.o CC kernel/microkernel/k_event.o CC kernel/microkernel/k_mailbox.o CC kernel/microkernel/k_mutex.o CC kernel/microkernel/k_fifo.o CC kernel/microkernel/k_semaphore.o CC kernel/microkernel/k_timer.o CC kernel/microkernel/k_pipe_buffer.o CC kernel/microkernel/k_pipe.o CC kernel/microkernel/k_pipe_get.o CC kernel/microkernel/k_pipe_put.o CC kernel/microkernel/k_pipe_util.o CC kernel/microkernel/k_pipe_xfer.o CC kernel/microkernel/k_nano.o CC kernel/microkernel/k_server.o LD kernel/microkernel/built-in.o CC kernel/nanokernel/nano_fiber.o CC kernel/nanokernel/nano_lifo.o CC kernel/nanokernel/nano_fifo.o CC kernel/nanokernel/nano_stack.o CC kernel/nanokernel/nano_sys_clock.o CC kernel/nanokernel/nano_context.o CC kernel/nanokernel/nano_init.o CC kernel/nanokernel/nano_sema.o CC kernel/nanokernel/version.o CC kernel/nanokernel/device.o CC kernel/nanokernel/errno.o LD kernel/nanokernel/built-in.o LD kernel/built-in.o CC misc/printk.o LD misc/debug/built-in.o CC misc/generated/configs.o CC misc/generated/sysgen/kernel_main.o LD misc/generated/sysgen/built-in.o LD misc/generated/built-in.o LD misc/built-in.o LD net/built-in.o CC boards/qemu_x86/board.o LD boards/qemu_x86/built-in.o LD boards/built-in.o AS arch/x86/core/i386_sysV_abi/intstub.o AS arch/x86/core/i386_sysV_abi/swap.o CC arch/x86/core/i386_sysV_abi/thread.o LD arch/x86/core/i386_sysV_abi/built-in.o CC arch/x86/core/fatal.o CC arch/x86/core/cpuhalt.o CC arch/x86/core/msr.o CC arch/x86/core/dynamic.o CC arch/x86/core/intconnect.o CC arch/x86/core/excconnect.o CC arch/x86/core/sys_fatal_error_handler.o AS arch/x86/core/crt0.o CC arch/x86/core/atomic.o AS arch/x86/core/cache_s.o CC arch/x86/core/cache.o AS arch/x86/core/excstub.o CC arch/x86/core/strtask.o LD arch/x86/core/built-in.o CC arch/x86/soc/ia32/soc.o LD arch/x86/soc/ia32/built-in.o LD arch/x86/built-in.o LD arch/built-in.o CC drivers/console/uart_console.o LD drivers/console/built-in.o CC drivers/interrupt_controller/i8259.o CC drivers/interrupt_controller/system_apic.o CC drivers/interrupt_controller/loapic_intr.o CC drivers/interrupt_controller/ioapic_intr.o LD drivers/interrupt_controller/built-in.o LD drivers/random/built-in.o CC drivers/serial/uart_ns16550.o LD drivers/serial/built-in.o CC drivers/timer/hpet.o CC drivers/timer/sys_clock_init.o LD drivers/timer/built-in.o LD drivers/built-in.o CC samples/hello_world/microkernel/src/main.o LD samples/hello_world/microkernel/src/built-in.o LINK zephyr.lnk SIDT staticIdt.o LINK zephyr.elf BIN zephyr.bin To exit from QEMU enter: 'CTRL+a, x' [QEMU] CPU: qemu32 Hello World!
Para sair dessa tela, pressione CTRL+a e x.
Opcionalmente podemos brincar no menuconfig para configurar o kernel, para tal execute:
make menuconfig
Teremos algo assim:
Para sair, navegue até a opção Exit.
Simples não? Agora podemos começar a desenvolver aplicações com esse poderoso RTOS.
Esse texto teve a contribuição de Thiago Lima.









OPAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Faltou incluir a libncurses no apt-get lah no comeco do sambado.
Sem isso, o make menuconfig nao funfa
Vou atualizar isso! 🙂 Obrigado Rafael!