フォールト(Fault)って何? 〜 種類と解析方法:Q&Aで学ぶマイコン講座(44)(3/4 ページ)
命令バス、データバスにかかわらず、バスアクセスに何らかの問題があり、メモリやレジスタの読み書きに支障がある場合に引き起こされます。発生要因を簡単にまとめると次のようになります。
- 命令のプリフェッチの段階で問題が発生(プリフェッチアボード)
- データの読み出し/書きこみの段階で問題が発生(データアボード)
- 割り込み処理の開始時のスタック(PUSH)操作時に問題が発生(スタッキングエラー)
- 割り込み処理の終了時のアンスタック(POP)操作時に問題が発生(アンスタッキングエラー)
- 割り込みベクタのフェッチの読み出しエラー
具体的には、次のような原因が考えられます。
- 存在しないアドレスへのアクセス:物理的または定義されていないアドレスへアクセスした場合
- スタック/アンスタックの場合に実在するRAMの領域から出てしまった場合
- ベクタテーブルを移動した際に、定義できない領域に割り当てた場合
- バスの動作スピードや仕様が合っていない(設定ミス)場合
- フラッシュメモリのウエイトサイクルを間違えた場合、正常な命令がプリフェッチできない(図1-a)
- システムクロックを設定する際に、バスの動作周波数のスペックを超えて設定した場合
- サポートしていないデータサイズの転送を行おうとした場合
- ハード的な破壊
図1:フォールトが引き起こされる事象例(Arm Cortex-M4の場合) (クリックで拡大) 【再掲】
用法フォールトには、次のようなものがあります。
- 0による除算の実行
- アンアライアンスアクセス
- Cortex-M4の場合は、32ビット境界をまたいでアクセスした場合(図1-b)
- 例外からの復帰に失敗した場合
- スタックの破壊
- 割り込みハンドラの実行中にスタックされたPCが破壊または変更された場合
- アセンブラ言語を使用してプログラムを作成している場合などに、Cortex-M4では対応していない命令を使った場合
ハードフォールトは、メモリ管理フォールト、バスフォールト、用法フォールト以外のフォールトです。具体的には次のようなものがあります。
- ベクタフェッチの失敗
- ベクタをフェッチする際に失敗した場合
- 無効なベクタテーブルオフセットを設定した場合
Copyright © ITmedia, Inc. All Rights Reserved.