HardFault
Cortex-Mの包括的な例外で、深刻なエラーを受け止める。ファームウェア版のセグメンテーション違反だが、何かを表示してくれるOSはない。
ベクタテーブルの例外番号3にあたる。Cortex-M0ではフォールト例外はこれだけだが、M3以降はMemManage、BusFault、UsageFaultといった細かい例外があり、有効化しない限りHardFaultに格上げされる。デフォルトでは無効だ。よくある原因は、スタックオーバーフロー、アラインされていないアクセス、フラッシュへの書き込み、壊れた関数ポインタ経由の呼び出し、そしてセミホスティングのブレークポイントの消し忘れである。
面白い点として、NULLポインタの読み出しはまず落ちない。アドレス0はフラッシュで、ベクタテーブルがそこにあるからだ。デフォルトのハンドラは無限ループにすぎない。本格的に書く人は、状態レジスタ CFSR と HFSR を読み、ハードウェアが退避したスタックフレームからプログラムカウンタを取り出す。そこに、転んだ命令そのものが書いてある。