28 ポイント 投稿者 GN⁺ 2025-09-16 | まだコメントはありません。 | WhatsAppで共有
  • 使い捨て電子タバコに内蔵された低性能な ARM Cortex-M0+ マイクロコントローラを使ってWebサーバーを動かした実験的プロジェクト
  • 24KiBフラッシュと3KiB RAM を備える PUYA 製 PY32F002B チップを解析し、SLIP方式でネットワーク接続を実装
  • Semihosting、SLIPプロトコル、uIP TCP/IPスタックを活用し、仮想tty経由でTCP/IP通信と HTTPサーバー機能 を移植
  • 当初は非常に遅かったが、バッファ最適化 とデータ処理改善により応答速度とページ読み込み速度を大幅に向上
  • 小容量メモリ 環境でも動的なサーバーコードの実行とAPIエンドポイントの提供まで実現
  • コードは公開中 で、実際のホスティングは可能だが、メモリなどのリソース制約は大きい

はじめに

  • この記事は、使い捨て電子タバコ上で直接動作するWebサーバーから配信されているのではなく、同じ内容を別サーバーで提供していることを先に明記しておく
  • 実際の動作例は http://ewaste.fka.wtf/ で確認できる

背景

  • 数年間、バッテリー を再利用しようという目的で、知人たちから 使い捨て電子タバコ を集めていた
  • 最近、使い捨て電子タバコ機器がますます高度化し、USB-C充電式バッテリー を搭載し始めたことに関心を持った
  • 分解中に PUYA という名前の フラッシュ内蔵 ARM Cortex-M0+ マイクロコントローラを発見し、低価格マイクロコントローラとしてよく知られたチップだった
  • このマイクロコントローラを複数モデルから集め、デバッグピンのラベル表示 がされていたため解析しやすかった

使用したハードウェア

  • チップ表記は PUYA C642F15 だったが、実際には PY32F002B 系列と推定される
  • 主な仕様:
    • 24MHz Cortex-M0+ コア
    • 24KiBフラッシュ
    • 3KiB RAM
    • いくつか周辺機器はあるが、本プロジェクトでは未使用
  • 一般的なスマートフォンと比べれば性能は低いが、組み込み環境では 簡易Webサーバーの構築 は十分可能

ネットワーク接続

  • 最初の発想そのものではなかったが、semihosting の概念を試しているうちにWebサーバーを動かすアイデアに至った
  • Semihosting は 組み込みARM で syscall を模倣する方法
    • レジスタに値やポインタを入れて breakpoint を呼び出すと、デバッガがそれを解釈して動作を処理する
    • 一般的にはログ送信用途だが、双方向データ通信 も可能
  • USBシリアルデバイスが SLIP(Serial Line Internet Protocol) プロトコルをサポートしており、これをネットワークインターフェースとして利用
  • Linux(および一部の macOS)で slattachsocat などを用い、仮想tty経由のSLIPネットワーク 環境を構築
    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  
    
  • TCP/IPスタックとして uIP を選択。非常に小さく、RTOSが不要で、移植しやすい
  • uIP のサンプル中の HTTPサーバー を活用し、SLIPコードを semihosting 方式に合わせて移植して Webサーバー起動に成功
  • ARMアーキテクチャでは16ビットアラインメントの問題があったため、filesystem生成スクリプトを修正 し、Perlで変換処理を行った

速度最適化

  • 初期状態では ping 1.5秒、50%のパケットロス、ページ読み込み20秒以上という非常に遅い応答速度だった
  • 原因は バイト単位I/O の大きなオーバーヘッドだった
  • 3KiB RAM を積極的に活用して リングバッファ を追加し、SLIP関数へまとめてデータを供給する構造に改善
  • 書き込みもバッチ分割 して送信処理し、高速なクリーンアップを実現
  • 最適化の結果、ping 20ms、ロスなし、ページ読み込み160ms を達成
  • 全体のRAMとフラッシュ使用量:
    • フラッシュ: 24KB中 5,116B(20.82%)
    • RAM: 3KB中 1,380B(44.92%)
  • ブログ全体のコンテンツも無理なく配信できる容量で、サーバーサイドのCコード実行も可能

その他の機能とまとめ

  • APIエンドポイント を直接実装し、メインページへのリクエスト回数とマイクロコントローラのユニークIDを返す
  • 極限の低性能ハードウェアと最小限のメモリで、動的WebサーバーとAPI まで実装した実験

参考

まだコメントはありません。

まだコメントはありません。