概要
- 使い捨てVape のマイコンで Webサーバー を動かす試み
- PUYA製PY32 マイコンの調査と特徴
- SLIPプロトコル と semihosting を活用した通信手法
- uIP による軽量IPスタック移植とパフォーマンス改善
- 実装と最適化のポイント、プロジェクトリソースの紹介
使い捨てVapeでWebサーバーを動かす
- 近年の 使い捨てVape は、USB-Cや再充電バッテリー搭載の高機能化
- 中身を分解し、 PUYA ロゴの IC(PY32シリーズ) を発見
- PUYAは主に フラッシュメモリ で有名だが、 ARM Cortex-M0+ 搭載マイコンも展開
- 複数モデルのVapeから PY32ベース の基板を収集・調査
- デバッグピンが明示されており、解析が容易
PUYA PY32F002Bのスペック
- PUYA C642F15 チップを解析し、 PY32F002B と特定
- 主な仕様
- 24MHz Cortex-M0+ コア
- 24KiBフラッシュ
- 3KiB SRAM
- 最低限の周辺機能のみ利用
- 性能は控えめだが、 Webサーバー 用途には十分
SLIPとsemihostingによる通信
- semihostingは、 ARMマイコン向けのシステムコール機構
- デバッガ経由で 双方向通信 が可能
- USBシリアル経由で SLIP(Serial Line Internet Protocol) を利用
- LinuxやmacOSで slattach コマンドを使い、仮想ttyを生成しIPパケット通信を実現
- pyOCD と socat でsemihostingをtelnetポート→仮想ttyへ変換し、SLIPでIP通信を確立
uIP移植と最適化
- uIP はRTOS不要の超軽量IPスタック、 最小限のHTTPサーバー 例付き
- SLIPコードをsemihosting対応に移植し、Webサーバーとして稼働
- ARMでは メモリアラインメント 制約があり、uIPの一部コードを修正
- Perlでファイルシステム生成スクリプトも調整し、移植性向上
パフォーマンス改善
-
初期実装では 1.5秒Ping・50%パケットロス、ページ表示20秒超
-
SLIPの 1バイト単位通信 がボトルネック
-
3KiBのRAM を活かし、 リングバッファ でバッチ転送を実装
-
書き込みもバッチ化し、パフォーマンス大幅向上
-
Ping 20ms・パケットロス0%、ページ表示160ms を実現
-
RAM・フラッシュの使用率も最適化
- FLASH: 5116B/24KB (20.82%)
- RAM: 1380B/3KB (44.92%)
実装・応用例
- 20KiB弱 のストレージでも、ブログ記事程度なら十分配信可能
- 静的ページだけでなく、C言語で サーバーサイド処理 も実装可能
- JSON API エンドポイントも追加し、リクエスト数やマイコンIDを返却
参考リソース・プロジェクト
- 本プロジェクトの コードリポジトリ を公開
- PY32C642に関する先行プロジェクトも存在
- SLIPの後継として PPP(Point-to-Point Protocol) も補足
このプロジェクトは、極限までリソースが限られたマイコンでも、工夫次第で実用的なWebサーバーが構築できることを示す好例。