使い捨て電子タバコでWebサイトをホスティングする
(bogdanthegeek.github.io)- 使い捨て電子タバコに内蔵された低性能な 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)で
slattachやsocatなどを用い、仮想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 まで実装した実験
まだコメントはありません。