non-blocking-patterns について
組み込み C/C++ のメインループを応答性の高い状態に保ち、タイミングをテスト可能にするスキルです。ブロッキング処理の置き換え、タイムアウトやウォッチドッグの設計、対象ボードでの検証を扱います。
主な機能
- 01オーバーフロー対応の経過時間チェック
- 02上限を設けた明示的なステートマシン
- 03ノンブロッキングなデバウンスと解析
- 04ウォッチドッグとタイムアウトの動作
- 05ループ遅延とジッターの測定
- 06タイミング境界のテスト
活用シーン
- 01ファームウェアの長い待機処理の置き換え
- 02シリアルやネットワーク処理の上限設定
- 03デバウンスとタイマー周回のテスト
- 04期限超過時の安全動作の定義
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ wedsamuel1230/ embedded-engineering-skills --skill non-blocking-patternsインストール後、Claude Code で/non-blocking-patternsを入力して読み込まれたか確認します。
詳細
ノンブロッキングパターン
メインループの応答性を維持し、タイミング動作をテスト可能にします。対象ボード向けにコンパイルできる C/C++ のパターンを優先し、Python は関連するテストまたはログ分析ツールにのみ使用します。
受け入れ情報
ボード/コアのバージョン、タスク周期、期限、最大処理時間、入力のチャタリング、シリアル/ネットワークの動作、ウォッチドッグのポリシー、割り込みの制約、期限を逃した場合の安全応答を記録します。
処理
- 周期的またはイベント駆動型の各タスクについて、周期、期限、最悪ケースの処理量を列挙します。ブロッキングするライブラリ呼び出しを特定します。
- 長い
delay()呼び出しを、if (static_cast<unsigned long>(now - last) >= period)のような符号なしのオーバーフローに安全な経過時間チェックに置き換えます。ハードウェアタイマーや RTOS タスクを使うのは、ボードとフレームワークが対応していることを確認できた場合に限ります。 - 複数段階の処理は、遷移回数に上限のある明示的なステートマシンとしてモデル化します。ヘルパー関数の中に待機処理を隠さないでください。
- ブロッキングする待機ではなく、安定状態タイマーまたはイベントフィルターで入力のチャタリングを除去します。シリアル解析、ネットワークの再試行、センサーの変換待ちに上限を設けます。
- ウォッチドッグへの給餌、出力の禁止、タイムアウト、復旧の動作を定義します。
- 代表的なログ出力、無線、ストレージ、アクチュエーターの負荷をかけた状態で、ループのレイテンシーとタスクのジッターを測定します。
正当化への対処
| 近道 | 応答 |
|---|---|
| 「短い delay なら問題ありません。」 | それでもブロッキングです。期限を示し、置き換えてください。 |
| 「USB 接続時はループが高速です。」 | 実際の無線、ストレージ、アクチュエーターの負荷で測定してください。 |
| 「enum を使っているのでステートマシンです。」 | 時間制約のある遷移、明示的な開始/終了処理、タイムアウト動作を必須にしてください。 |
| 「ウォッチドッグはどこでも給餌できます。」 | 管理主体とフェイルセーフ動作を定義してください。タスクの停止を隠さないでください。 |
「millis() はオーバーフローしません。」 | 符号なしの減算を使い、オーバーフロー境界をテストしてください。 |
検証
- 時間制約のある経路に、理由とタイムアウトが文書化されていない、上限のないブロッキング呼び出しが残っていません。
- チャタリング除去、オーバーフロー、タイムアウト、期限超過のケースをテストしています。
- 対象を指定したコンパイルの証明と、タイミング/シリアルの証拠は分けて示しています。
- タスク、センサー、通信経路がタイムアウトした場合、出力は安全な状態になります。
出力に関する共通契約
共通の Arduino スキル契約に従い、前提条件、必要なツールとバージョン、実装手順、証明段階ごとのテスト/証拠、既知の制限事項、復旧/セキュリティに関する注意事項を明記します。
コメント
Markdown 対応