AI支援MCUドライバのレビュー:レジスタ、タイミング、異常経路
AI支援でMCUドライバを開発する場合、レビューはコンパイラの確認だけで終わらず、ハードウェアレジスタまで届く必要があります。もっともらしい関数でも、レジスタの意味を誤解し、永久に待機し、異常発生後に古いデータを返す可能性があります。有用な成果物とは、仮定、異常経路、受入証拠を特定のデバイスに照らして確認できる、小さなパッチです。
本稿では架空の収集用ペリフェラルを使い、生成コード風の不良例とレビュー後の例を説明用に構成しています。この例のためにAIツールは実行しておらず、実機試験やタイミング測定の結果も報告していません。コード断片は教材であり、そのまま実機へ適用できるテンプレートではありません。
1. 草案を制約する入力資料を用意する
MCUの完全な注文型番、シリコン版、基板版、リファレンスマニュアルの版、エラッタ、SDKまたはデバイスヘッダの正確なコミットから始めます。製品ファミリ名だけでなく、該当レジスタのページを提供してください。同じファミリでも、似た名前のフラグでクリア方法が異なる場合があります。モデルに近縁デバイスの記憶で空白を埋めさせてはいけません。
基板が実際に選択するクロックツリー、許容転送速度、ペリフェラルのリセット状態、ピン割り当て、電源モードの制約も追加します。呼び出し元がタスクか割り込みか、DMAを使用するか、誰がペリフェラルを所有するか、キャンセル方法は何かを明示します。コードを依頼する前に、成功、タイムアウト、ハードウェア異常、不正引数の結果を定義してください。不足する入力があれば、不確実性を列挙し、名前付きの未確定箇所を残すよう指示します。
依頼範囲は狭くします。提供されたレジスタ定義で、時間上限のある単一収集トランザクションを作り、マニュアルに基づく仮定をすべて明示し、アドレス、リセット値、エラッタ回避策を創作しないことです。不確実性一覧と試験案は別に求めます。ライセンス付き資料と機密回路図は、プロジェクトで承認された情報共有の範囲内に保ってください。

2. 不良草案を一連の主張として読む
/* Invented teaching peripheral: deliberately flawed */
ACQ->STATUS |= DONE;
ACQ->DIV = 48000000 / requested_hz;
ACQ->CTRL |= START;
while (!(ACQ->STATUS & DONE)) { }
return ACQ->DATA;
最初の行が最重要の確認対象です。架空のSTATUSレジスタに、1を書いてクリアする完了ビットと異常ビットがあると仮定します。読み取り・変更・書き戻しは、無関係な保留イベントの1も書き戻し、それらをクリアする恐れがあります。通常のRAM更新という抽象化は適切ではありません。ArmのCMSIS-SVDレジスタ記述は、アクセス属性、特殊な書き込み動作、読み取りの副作用を明確に区別しています。SVDファイルは有用な資料ですが、正確なデバイスマニュアルとエラッタも必要です。
48 MHzという定数は、ペリフェラルクロックが固定周波数だと暗黙に主張しています。除算は、特定の分周値の符号化と丸め規則を仮定しています。いずれも未確認です。要求値がゼロならゼロ除算となり、高すぎれば不正な分周値になる可能性があります。数値として有効でも、センサの許容クロックや収集の安定待ち時間に違反し得ます。
ループには期限も異常分岐もありません。接続断、クロック停止、未処理のオーバーランで、呼び出し元が無期限に停止する恐れがあります。独立したステータス結果がないため、有効データとさまざまなエラーを区別する手段もありません。また、割り込みや別タスクが同じフラグを確認処理しないと仮定しています。すべての名前がコンパイルできても、これらは動作上の欠陥です。
3. レジスタに割り当てる前に修正ロジックを確認する
/* Review pseudocode, not a device implementation. */
require(exclusive_owner && output != NULL);
require(valid_clock_and_divider(clock_hz, requested_hz));
require(timer_runs_during_wait && budget_within_wrap_limit);
prepare_idle_device_or_fail(); // bounded, device-specific
ack_owned_stale_flags(); // exact manual-defined write
configure_validated_divider();
start = monotonic_ticks();
start_one_transfer();
for (;;) {
s = read_non_destructive_status();
if (s & FAULTS) {
capture_fault(s);
return abort_and_quiesce_or_mark_unusable(IO_ERROR);
}
if (s & DONE) {
value = read_result_in_required_order();
acknowledge_owned_completion();
*output = value;
return OK;
}
if (elapsed_unsigned(start) >= budget_ticks)
return abort_and_quiesce_or_mark_unusable(TIMEOUT);
}
修正例では意図的に方針とデバイスアクセスを分離しています。各補助関数には、選定したシリコン向けのレビュー済み実装が必要です。架空のwrite-one-to-clearレジスタでは、イベントの確認処理は事前に読み取らず、自分が管理する文書化されたマスクだけを書くことを意味します。この規則は、読み取りでクリアするレジスタや、状態とデータの特定の読み取り順序を要求するデバイスには転用できません。
この例は、単一所有者、実行中トランザクションは1件、非破壊的な状態読み取りを前提とします。異常と完了が同時に見えた場合は異常を優先し、疑わしいデータを成功として返しません。他の製品に別の方針が必要なら、その選択を明示します。タイムアウト後はペリフェラルを停止状態にするか、時間制限付きリセットが成功するまで使用不能とします。DMAが解放済みバッファへ書き続ける状態でエラーを返しても、安全な復旧ではありません。
関係する電源状態と割り込み状態で動作が分かっている単調な時刻源を使います。符号なしの経過時間計算でカウンタの周回を扱えるのは、文書化した期間と観測モデルの範囲内だけです。最大時間予算を定め、タイマが進み続けることを確認してください。割り込みで更新するティックを時間源にすると、ポーリングがその割り込みを妨げた場合にタイムアウトが機能しません。
4. タイミング、並行動作、異常処理の責任を分けて確認する
マニュアルからレジスタアクセスのチェックリストを作ります。アクセス幅、アラインメント、予約ビット、書き込み保護、リセット値、フラグのクリア順序、クロックとリセットの前提条件です。各アクセスの理由も記します。慎重に見えるというだけでメモリバリアを追加せず、どの順序を保証するかをアーキテクチャとデバイスの要件で説明します。
タイミングでは、選択したクロック、実際の分周値の符号化、丸め方から設定速度を計算します。ペリフェラルの制限とアプリケーションの許容誤差に比較してください。変換時間、該当する場合のチップセレクトのセットアップ/ホールド時間、異常復旧時間も含めます。これは提案する計算であり、測定済み性能ではありません。
並行動作では、トランザクション状態と完了処理の所有者を1つに定めます。割り込み優先度、共有データ、キャンセル、コールバック実行文脈を選定RTOSのAPIに照らして確認します。volatile変数だけでは完全な同期設計になりません。DMAでは、バッファ寿命、メモリアクセス可能性、プラットフォーム固有のキャッシュ保守を記録します。既知のメーカー関数名を使う草案でも、この確認は必要です。
5. レビュー要件を反証可能な試験にする
- レジスタモデル試験:write-one-to-clear、DONEとFAULTの同時発生、古い完了状態、予約ビットを模擬します。受入には、意図した正確な書き込みと、無関係なフラグを確認処理しないことが必要です。
- 境界試験:ゼロおよび範囲外速度、最小と最大の合法分周値、タイマ周回、利用不能クロックを試します。明確な拒否、または時間上限内の失敗が期待結果であり、偽の成功値を返してはいけません。
- 所有権試験:各遷移でキャンセルと第2呼び出し元を注入します。ハードウェアが所有中のバッファを再利用できないこと、完了通知が最大1回であることを示す計画にします。
- ベンチ試験:選定基板で関係するクロック、データ、制御信号を取得し、コールドスタートを繰り返し、対応する電源と温度条件を試します。波形が見えるだけで合格とせず、測定タイミングを事前合意した制限と比較します。
- 復旧試験:応答をなくすか、対応する異常を安全に注入します。タイムアウト状態、復旧時間、次回トランザクションの動作を確認し、リセット失敗時の明確な使用不能状態も含めます。
ファームウェアコミット、コンパイラオプション、基板識別情報、試験構成、期待制限、実際の観測、未加工トレースの保存先を記録します。シミュレーションが示すのはモデル内のソフトウェア動作、ベンチトレースが示すのは記載条件で試験した組立品の動作です。どちらも無制限の信頼性主張を正当化しません。
6. 人がレビューした結果をまとめる
変更した各レジスタアクセスを根拠資料へ、各異常分岐を試験へ、未解決の各仮定を担当者へ対応づけます。修正の説明に役立つなら元の不良草案を残してよいですが、採用するのはレビュー済み差分だけです。2回目のAIレビューは有用な質問を生み出せますが、同意だけで最初の草案を認証することはできません。
製品開発については、Obeitaのファームウェア/BSP診断サービスが関連する技術相談先になります。STM32データ収集プロジェクトでは、関連する収集とアプリケーション統合の背景を確認できます。このリンクは、上記の架空ドライバがその納入案件で使われた、AI生成された、または試験されたことを意味しません。