28 pontos por GN⁺ 2025-09-16 | Ainda não há comentários. | Compartilhar no WhatsApp
  • 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, socat e afins
    pyocd 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

Referência

Ainda não há comentários.

Ainda não há comentários.