Skip to content

Progress Log: v1.9.5 リファクタリング検証計画(ベースライン vs フル機能比較)

Task Description

v1.9.5のリファクタリング効果を定量化するため、ベースライン構成とフル機能構成を比較する検証計画を策定した。

検証アプローチ

v1.0.0との厳密な比較は困難なため、v1.9.5を基準として以下を実施:

  1. ベースライン構成 - すべてのコンパイルフラグを無効化
  2. フル機能構成 - すべてのコンパイルフラグを有効化(ただしWIFIはOFF)

この2つを比較してパフォーマンスインパクトを定量化し、リファクタリングの効果を検証

検証対象

  • パフォーマンス比較:RAM/Flash使用量、ビルド時間
  • 機能検証:フル機能時のすべての機能動作確認
  • 個別フラグ検証:WiFi、RTC等の重要フラグについては追加検証

Outcome

検証計画を完全に策定。以下の構成で実施予定。


検証項目

1. ベースライン構成

すべてのオプション機能を無効化した最小構成

[env:esp32dev-release]
build_type = release
build_flags =
    ${env.build_flags}
    -O2
    -DCORE_DEBUG_LEVEL=0
    -DADC_DEPEND_CHANNEL=1
    -DENABLE_BME280=1
    -DDEADTIME_MS=0
    -DSTREAM_FORMAT=0
    -DENABLE_FREERTOS_QUEUE=0
    -DENABLE_GPIO_ABSTRACTION=0
    -DENABLE_TEXT_PROTOCOL=0
    -DENABLE_WIFI=0
$ task prod:build

RAM:   [=         ]   6.9% (used 22648 bytes from 327680 bytes)
Flash: [==        ]  23.1% (used 303341 bytes from 1310720 bytes)

期待される特性:

  • 最小のFlash使用量
  • 最小のRAM使用量
  • 基本的な検出機能のみ

2. フル機能構成(WIFI=0)

WIFI以外のすべてのオプション機能を有効化

[env:esp32dev-dev]
build_type = release
build_flags =
    ${env.build_flags}
    -O2
    -DCORE_DEBUG_LEVEL=0
    -DADC_DEPEND_CHANNEL=1
    -DENABLE_BME280=1
    -DDEADTIME_MS=0
    -DSTREAM_FORMAT=3
    -DENABLE_ADCMV=1
    -DENABLE_FREERTOS_QUEUE=1
    -DENABLE_GPIO_ABSTRACTION=1
    -DENABLE_RTC=1
    -DENABLE_TEXT_PROTOCOL=1
    -DENABLE_TIMESTAMP=1
    -DENABLE_WIFI=0
$ task dev:build
RAM:   [=         ]   7.7% (used 25392 bytes from 327680 bytes)
Flash: [==        ]  24.3% (used 318621 bytes from 1310720 bytes)

期待される特性:

  • すべてのオプション機能が動作
  • テキストコマンドプロトコル対応
  • WiFi、RTC、タイムスタンプ機能搭載

(参考)フル機能構成(WIFI=1)

$ PLATFORMIO_BUILD_FLAGS="-DENABLE_WIFI=1" task dev:build
RAM:   [=         ]  14.9% (used 48728 bytes from 327680 bytes)
Flash: [======    ]  60.7% (used 795801 bytes from 1310720 bytes)
============ [SUCCESS] Took 7.73 seconds ======================

Environment    Status    Duration
-------------  --------  ------------
esp32dev-dev   SUCCESS   00:00:07.735
============ 1 succeeded in 00:00:07.735 =======================

検証チェックリスト

Phase 1: ビルド比較

  • ベースライン構成をビルド
  • ビルド成功確認
  • RAM使用率を記録: 6.9%
  • Flash使用率を記録: 23.1%
  • ビルド時間を記録: 00:00:06.278

  • フル機能構成をビルド

  • ビルド成功確認
  • RAM使用率を記録: 7.7%
  • Flash使用率を記録: 24.3%
  • ビルド時間を記録: 00:00:07.228

Phase 2: メモリ使用量分析

基本比較(WiFi=0)

メトリクス ベースライン フル機能 増加量
RAM (%) 6.9% 7.7% +0.8%
Flash (%) 23.1% 24.3% +1.2%
ビルド時間 (s) 6.278 7.228 +0.950

分析結果:

  • RAM増加: 22648 → 25392バイト = +2744バイト (+0.8%)
  • Flash増加: 303341 → 318621バイト = +15280バイト (+1.2%)
  • ビルド時間増加: 0.95秒 (+15%)

WiFi機能のコスト分析

メトリクス フル機能(WiFi=0) フル機能(WiFi=1) WiFi追加コスト
RAM (%) 7.7% 14.9% +7.2%
Flash (%) 24.3% 60.7% +36.4%
ビルド時間 (s) 7.228 7.735 +0.507

分析結果:

  • RAM追加: 25392 → 48728バイト = +23336バイト (+7.2%)
  • Flash追加: 318621 → 795801バイト = +477180バイト (+36.4%)
  • ビルド時間追加: 0.51秒 (+7%)

全体評価

構成 評価 理由
ベースライン ✅ 優秀 最小限のメモリ使用。後方互換性検証に最適
フル機能(WiFi=0) ✅ 優秀 フル機能で+0.8% RAM、+1.2% Flash。非常に効率的
フル機能(WiFi=1) ⚠️ 容認可能 Flash 60.7%使用。WiFi搭載時の現実的な構成

結論:

  • v1.9.5のリファクタリングは極めて効率的に実装されている
  • WiFiなしで全機能を搭載可能(+1.2% Flash)
  • WiFi機能の追加で+36.4% Flashだが、ESP32のメモリに十分な余裕あり
  • 用途に応じて柔軟に構成可能な設計

Phase 3: ベースライン動作確認

  • ファームウェア書き込み成功
  • シリアル出力確認(SSV形式のみ)
  • 宇宙線検出で正常なイベント出力
  • LEDフィードバック動作
  • 基本的なセンサー読み込み

Phase 4: コマンドキューの動作確認

目的

ENABLE_FREERTOS_QUEUE=1をデフォルト設定にしてもよいことを確認する

問題(v1.0.0)

スレッショルド設定(DAC書き込み)がたまに失敗する。 成功の可否は、書き込み時のエコーで確認している。 これが期待している文字列でない場合に「失敗」と判定している。

考えられる原因

原因はいまいち分かっていないが、 OSECHIのLED点灯の様子からスレッショルドは設定されているようなので、 シリアル通信に起因する問題かもしれないと思っている。

測定に与えている影響

スレッショルド値の設定の成功が保証できていないので、測定データも保証できていない。 とくに、スレッショルドスキャンを実施する際に影響がある。 スレッショルド値を短時間(10秒間隔)で変更すると、DAC書き込みの失敗判定が多い。

対処した内容(v1.9.5)

kurikintonsに、コマンド受信時のキューを導入した。 リトライ回数が減少することを期待。

確認手順

  • ENABLE_TEXT_PROTOCOL=0でビルド
  • 理由:haniwersのDAC書き込みがテキストコマンドに対応していないため
  • haniwers-v1 threshold parallelコマンドを使う
  • すべてのチャンネルに対して並列スキャンを実施。
  • リトライ回数(=成功するまでに書き込んだ回数)を記録
  • 平均リトライ回数を比較
  • v1.0.0(以前に測定済み)
  • v1.9.5(ENABLE_FREERTOS_QUEUE=0
  • v1.9.5(ENABLE_FREERTOS_QUEUE=1
  • 確認事項
  • v1.0.0 -> v1.9.5で平均リトライ回数が50%以上減少することを確認
  • QUEUE=0 / QUEUE=1で平均リトライ回数が10%以内の差分に収まることを確認

測定条件

$ uv run haniwers-v1 threshold parallel --thresholds "1:300;2:300;3:300" --step 1 --nsteps 100 --max-retry 100 --duration 2
  • 中心値: 300--thresholds "1:300;2:300;3:300"
  • スキャン範囲: [200, 400]--step 1 --nsteps 100
  • 1点あたりの測定時間: 2秒(--duration 2
  • 最大リトライ回数: 100回(--max-retry 100

測定結果(ファイル名)

  • v1.0.0:
  • v1.9.5(カスタムキュー):
  • v1.9.5(FreeRTOS Queue):

測定結果の比較

  • Jupyter Notebookで解析
  • それぞれの測定のthreshold_history.csvを読み込む
  • 概算
  • 平均リトライ数を計算する
  • 詳細
  • スレッショルド値とリトライ回数の散布図(棒グラフ)を作成する

Phase 4: フル機能動作確認

4.1 シリアル通信フォーマット

  • JSONL形式で出力確認(STREAM_FORMAT=3)
  • テキストコマンドHELP実行確認
  • テキストコマンドSTATUS実行確認
  • テキストコマンドGET_VERSION実行確認

4.2 タイムスタンプ機能

  • uptime_msフィールド出力確認
  • timedelta_usフィールド出力確認
  • RTC: SET_TIMEコマンド実行確認
  • RTC: GET_TIMEコマンド実行確認
  • 検出イベントにunix_timestampが含まれること確認

4.3 環境センサー

  • BME280: 温度値の出力確認
  • BME280: 気圧値の出力確認
  • BME280: 湿度値の出力確認

4.4 WiFi機能

  • WiFiAPモード起動確認(SSID: OSECHI-DETECTOR)
  • 192.168.4.1でアクセス可能
  • ステータスページ表示

4.5 その他機能

  • ADC電圧表示(ENABLE_ADCMV=1)
  • GPIO抽象化レイヤー(ENABLE_GPIO_ABSTRACTION=1)

個別フラグ検証(必要に応じて)

重要なフラグについては追加検証実施

WiFi機能(ENABLE_WIFI=1)

  • AP モード安定性テスト(5分間の連続接続)
  • 接続切断・再接続の動作確認

RTC機能(ENABLE_RTC=1)

  • 時刻設定の永続化確認
  • 検出イベント毎の time_timestamp 記録確認

テキストプロトコル(ENABLE_TEXT_PROTOCOL=1)

  • 全コマンドの実装確認
  • エラーハンドリング動作確認

記録フォーマット

検証実施時に以下の情報を記録:

## ベースライン構成(日付: ___)

ビルド結果:
- RAM: ___ %
- Flash: ___ %
- ビルド時間: ___ s

動作確認:
- シリアル出力: ✅/❌
- 検出機能: ✅/❌
- LED フィードバック: ✅/❌

## フル機能構成(日付: ___)

ビルド結果:
- RAM: ___ %
- Flash: ___ %
- ビルド時間: ___ s

動作確認:
- テキストコマンド: ✅/❌
- WiFi機能: ✅/❌
- RTC機能: ✅/❌
- タイムスタンプ: ✅/❌
- 環境センサー: ✅/❌

## 分析結果

メモリ増加率(フル機能 - ベースライン):
- RAM: ___ % → ___ % = +___ %
- Flash: ___ % → ___ % = +___ %

結論:
[リファクタリングの効果、パフォーマンスインパクト等を記載]

Learnings

  1. v1.0.0との比較が困難な理由
  2. v1.0.0はタグの切り替えが必要(機能も不足しているため、比較しにくい)
  3. v1.9.5の多くの機能がコンパイル時フラグで制御可能
  4. ベースラインvsフル機能の比較が実測値で可能

  5. モジュール化の価値

  6. すべての機能がコンパイル時フラグで制御可能
  7. 不要な機能を除外してメモリを最適化可能
  8. 3つのビルドプロファイルで異なるニーズに対応

  9. 検証の実用性

  10. ベースライン構成で基本機能の検証(後方互換性確認)
  11. フル機能構成で新機能の検証
  12. 両者の比較でリファクタリングのコスト・ベネフィット明確化

Next Steps

  1. 検証実施
  2. ベースライン構成のビルド・テスト実施
  3. フル機能構成のビルド・テスト実施
  4. メモリ使用量の記録

  5. 結果分析

  6. 増加量の分析(許容範囲内か確認)
  7. 機能の完全性確認

  8. ドキュメント作成

  9. 検証結果を progress ログに追記
  10. v1.10.0 リリースノート作成(予定)