Há cerca de um ano estou trabalhando em uma máquina interessante. O primeiro desafio foi construir um dispositivo de quiosque. Durante o trabalho, fiz muita pesquisa e acabei chegando no Nerves.
O que é Nerves?
Crie e implante softwares incorporados à prova de balas no Elixir.
Você pode ler mais sobre este projeto aqui: https://nerves-project.org/
O Nerves é uma excelente ferramenta para ajudar você a envolver o software que você escreveu em um único firmware. Você pode gravá-lo em cartão SD, pen drive ou em uma unidade SD. Arquivo de firmware de arquivo único é uma grande vantagem. Você pode gravar algumas versões de firmware em vários pen drives e alterná-los facilmente.
O que precisamos alcançar?
Precisamos de um dispositivo de quiosque com duas telas. Os monitores devem nos mostrar um conteúdo da web servido pelo servidor local (sem conexão com a internet). O material de backend é escrito em Elixir, é claro. Todas as coisas estão rodando no X86_64 com o Radeon. O importante é que precisaremos do poder total da GPU.
Sobre o que é este artigo?
Não é um guia passo a passo para construir uma coisa dessas. Compartilharei com vocês algumas dicas aprendidas durante o trabalho com buildroot e nerves.
Começo!
Como bom começo, temos que gravar alguma coisa e ver o que vai acontecer.
O primeiro que eu tentei, foi esse aqui:
Bom começo, mas nada funciona. Por que? Porque não há drivers de radeon. Nós cuidaremos disso mais tarde.
Então, eu comecei a construir um novo nerves_system no topo de:
Cache do Buildroot
Eu passei muito tempo observando o sistema de nerves compilar. Para tornar as coisas mais rápidas, você pode ativar o cache. O Buildroot tem um build em solução. Tudo que você precisa fazer é adicionar uma única linha ao arquivo nerves_defconfig.
BR2_CCACHE=y
Agora sua próxima construção deve terminar muito mais rápido.
Radeon drivers
Como eu mencionei, o driver GPU é uma obrigação. Existem dois lugares. O primeiro é um kernel Linux, o segundo é uma configuração burildroot.
Eu adicionei essa linha no arquivo linux – *.config:
CONFIG_DRM_AMDGPU=y CONFIG_DRM_AMDGPU_SI=y CONFIG_DRM_AMDGPU_CIK=y CONFIG_DRM_AMDGPU_USERPTR=y BR2_PACKAGE_LINUX_FIRMWARE=y BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y
Sim, nada de mais! Mas isso não é o suficiente; precisamos de algumas outras coisas. Para fazê-lo funcionar, precisaremos de pelo menos a versão 2018.05 do buildroot. Não se preocupe, o Nerves o suportam a partir de uma versão 1.2. Isso pode ser feito com a versão posterior, mas por que devemos nos preocupar com hacks sujos se podemos tornar isso mais fácil?
Precisamos dos drivers kernel e mesa3d!
BR2_PACKAGE_LINUX_FIRMWARE=y BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y BR2_PACKAGE_MESA3D=y BR2_PACKAGE_MESA3D_LLVM=y BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y BR2_PACKAGE_MESA3D_DRI_DRIVER_RADEON=y BR2_PACKAGE_MESA3D_OPENGL_EGL=y BR2_PACKAGE_MESA3D_OPENGL_TEXTURE_FLOAT=y
As duas primeiras linhas instalarão o driver da GPU no sistema alvo, e em seguida, nós pedimos ao buildroot para instalar os drivers da mesa3d. A última linha é importante. Eu passei muito tempo tentando entender por que há muitas falhas na tela, a última linha resolve o problema completamente.
Faça as coisas mais rápido
Descobri que nosso aplicativo é muito mais lento em comparação com um aplicativo executado no Ubuntu. Não é sobre GPU. A carga da CPU foi duas vezes maior que no Ubuntu? Por que? Como sempre, muita pesquisa e uma solução muito fácil.
CONFIG_NO_HZ_FULL=y CONFIG_NO_HZ_FULL_ALL=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_SCHED_SMT=y CONFIG_PREEMPT=y CONFIG_CPU_IDLE_GOV_MENU=y
Eu sei que parece estranho, mas esses switches do kernel irão melhorar o planejamento de tempo da CPU. Como eu descobri isso? Quando pensei no por quê da média de carga ser tão alta. Observei como o kernel do Ubuntu está configurado. Houve seção da CPU; depois de algumas consultas ao Google, ficou claro.
Otimização de compilação
O Buildroot otimizando o sistema de destino para o tamanho não é muito produtivo. Você pode mudar isso.
BR2_OPTIMIZE_3=y
É isso aí! Você pode tentar o BR2_OPTIMIZE_FAST, mas isso não funcionará para mim.
Mostre-me algo
Precisamos de um navegador da web! Durante um dos ElixirConf, os caras do Nerves nos convenceram a usar o QT5. QT é ótimo. É muito leve, tem um componente webengine e você pode criar um aplicativo com poucas linhas de código C ++ e QML. Como posso instalar isso? Você está aqui:
BR2_PACKAGE_QT5=y BR2_PACKAGE_QT5BASE_SQLITE_SYSTEM=y BR2_PACKAGE_QT5BASE_LINUXFB=y BR2_PACKAGE_QT5BASE_DEFAULT_QPA="eglfs" BR2_PACKAGE_QT5BASE_GIF=y BR2_PACKAGE_QT5BASE_PNG=y BR2_PACKAGE_QT5MULTIMEDIA=y BR2_PACKAGE_QT5WEBENGINE=y
Outra vantagem disso é que você não precisa se preocupar com a configuração do Xorg ou Wayland. Não é necessária. O QT possui seu próprio compositor e suporta o OpenGL também.
Configurando o WebEngine
É muito fácil configurar o WebEngine dentro do seu aplicativo. Tudo o que você precisa usar é a variável de ambiente QTWEBENGINE_CHROMIUM_FLAGS.
Passei muito tempo tentando descobrir como ativar o antialiasing no contexto do WebGL. Tentei adicionar switches, mas sempre no final dos parâmetros o QT adicionou alguns switches próprios que desabilitam o antialiasing. O switch –disable-embedded-switches fez o trabalho.
Espero que tenha sido útil para vocês. Obrigado pela leitura! Você gostou? Obrigado!
***
Michał Kalbarczyk faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://blog.fazibear.me/7-tips-building-kiosk-device-with-nerves-and-buildroot-9d6cbf089600