Hospedando um site em um vape descartável
(bogdanthegeek.github.io)- Projeto experimental que colocou um servidor web para rodar usando o microcontrolador ARM Cortex-M0+ de baixo desempenho embutido em um vape descartável
- Análise do chip PY32F002B da PUYA, com 24KiB de flash e 3KiB de RAM, e implementação da conexão de rede via SLIP
- Uso de semihosting, do protocolo SLIP e da pilha TCP/IP uIP para portar comunicação TCP/IP e a função de servidor HTTP por meio de um tty virtual
- Embora inicialmente fosse muito lento, a otimização de buffers e melhorias no processamento de dados aumentaram drasticamente a responsividade e a velocidade de carregamento das páginas
- Mesmo em um ambiente de memória extremamente limitada, foi possível executar código dinâmico no servidor e oferecer endpoints de API
- O código está disponível, e a hospedagem real é possível, embora haja grandes limitações de recursos, como memória
Introdução
- Este texto esclarece primeiro que não está sendo servido diretamente por um servidor web rodando no vape descartável, e sim que o mesmo conteúdo é fornecido por um servidor separado
- É possível ver um exemplo real de funcionamento em http://ewaste.fka.wtf/
Contexto
- Ao longo de alguns anos, o autor coletou vapes descartáveis de conhecidos com o objetivo de reaproveitar as baterias
- Recentemente, chamou atenção o fato de que os vapes descartáveis estão ficando mais sofisticados, passando a incluir USB-C e baterias recarregáveis
- Durante a desmontagem, foi encontrado um microcontrolador ARM Cortex-M0+ com flash embutida da PUYA, um chip bem conhecido na categoria de microcontroladores baratos
- Esses microcontroladores foram coletados de vários modelos, e como havia identificação dos pinos de depuração, a análise ficou mais fácil
Hardware utilizado
- A marcação no chip era
PUYA C642F15, mas acredita-se que ele pertença na prática à família PY32F002B - Principais especificações:
- núcleo Cortex-M0+ de 24MHz
- 24KiB de flash
- 3KiB de RAM
- vários periféricos, embora não tenham sido usados neste projeto
- Em comparação com um smartphone comum, o desempenho é baixo, mas em um ambiente embarcado ainda é perfeitamente viável montar um servidor web simples
Conexão de rede
- A ideia não era inédita, mas ao experimentar o conceito de semihosting, surgiu a proposta de fazer um servidor web rodar dessa forma
- Semihosting é uma forma de simular syscalls em ARM embarcado
- valores/ponteiros são colocados em registradores e, ao chamar um breakpoint, o depurador interpreta isso e executa a operação
- normalmente é usado para envio de logs, mas também permite comunicação bidirecional de dados
- Dispositivos USB serial oferecem suporte ao protocolo SLIP (Serial Line Internet Protocol), e isso foi aproveitado para usá-los como interface de rede
- Em Linux (e em parte no macOS), foi montado um ambiente de rede SLIP por tty virtual com
slattach,socate afinspyocd gdb -S -O semihost_console_type=telnet -T $(PORT) $(PYOCDFLAGS) & socat PTY,link=$(TTY),raw,echo=0 TCP:localhost:$(PORT),nodelay & sudo slattach -L -p slip -s 115200 $(TTY) & sudo ip addr add 192.168.190.1 peer 192.168.190.2/24 dev sl0 sudo ip link set mtu 1500 up dev sl0 - A pilha TCP/IP escolhida foi a uIP, por ser muito pequena, não exigir RTOS e ser fácil de portar
- Foi usado o exemplo de servidor HTTP da uIP, com o código SLIP portado para o modelo de semihosting, o que permitiu iniciar o servidor web com sucesso
- Como há um problema de alinhamento de 16 bits na arquitetura ARM, foi necessário modificar o script de geração do filesystem e fazer uma conversão em Perl
Otimização de desempenho
- No estado inicial, a resposta era muito lenta: ping de 1,5 segundo, 50% de perda de pacotes e carregamento de página acima de 20 segundos
- A causa era o grande overhead de entrada e saída byte a byte
- Foi adicionado um ring buffer, aproveitando ao máximo os 3KiB de RAM, e a função SLIP passou a receber dados em lote
- A escrita também foi dividida em lotes para transmissão, permitindo uma limpeza mais rápida
- Após as otimizações, o resultado foi ping de 20ms, sem perdas, e carregamento de página em 160ms
- Uso total de RAM e flash:
- flash: 5.116B de 24KB (20,82%)
- RAM: 1.380B de 3KB (44,92%)
- Há capacidade suficiente para servir todo o conteúdo do blog sem dificuldade, e também é possível executar código C no lado do servidor
Outros recursos e conclusão
- Foram implementados endpoints de API diretamente, retornando o número de requisições à página principal e o ID único do microcontrolador
- Trata-se de um experimento que conseguiu implementar até mesmo servidor web dinâmico e API com hardware extremamente limitado e o mínimo de memória
Ainda não há comentários.