例外処理

例外発生時の動作

ARMv7アーキテクチャ以前、およびARMv7-A/Rプロファイルのプロセッサで規定されている例外のうち、 Reset, IRQ, FIQ を除く以下の4種類は、 SOLID Core Service で補足され、 これらの例外が発生した場合は自動的にプログラムが停止します。

  • Data Abort (データアボート例外)
  • Undefined Instruction (未定義命令例外)
  • Prefetch Abort (プリフェッチアボート例外)
  • SVC (スーバーバイザコール例外)

例外発生時のレポート

SOLIDでは、例外発生時に、その要因がデバッグ例外ウィンドウに表示されます。

データアボート

データアボートを発生させる以下のようなプログラムを用意して、実行してみます。

/* 無効なアドレスをアクセスする */
char *p = (char *)0xffffee00;
*p = 0;

上記コードを実行すると、*p = 0; の行でプログラムが自動的に停止し、デバッグ例外ウィンドウに要因が 表示されます。この例では、実行アドレス0xf0c00448で0xffffee00にライトアクセスを行い、データアボート例外が発生 した事がわかります。

../_images/data-abort-excp.png

未定義命令例外

未定義命令例外を発生させる以下のようなプログラムを実行してみます。

/* 無効な命令の実行 */
asm volatile (".long 0xffffeeee");

上記コードを実行すると、プログラムが自動的に停止し、デバッグ例外ウィンドウに要因が表示されます。 この例では、実行アドレス0xf0c00434でコード0xffffeeeeを実行し、未定義命令例外が発生 した事がわかります。

../_images/undef-insn-excp.png

プリフェッチアボート

プリフェッチアボートを発生させる以下のようなプログラムを実行してみます。

/* 関数ポインタに無効なアドレスをセットし、コールする */
char (*func)(void) = (void *)0xffffee00;
func();

上記コードを実行すると、プリフェッチアボート例外が発生し自動的にプログラムが停止します。 この例では、実行アドレス0xffffee00でプリフェッチアボート例外が発生 した事がわかります。

../_images/prefetch-abort-excp.png

例外処理の変更

前述の動作は、Core Service が提供するAPI SOLID_VECTOR_Register を使用し例外ハンドラを登録することで変更できます。 以下のコード例では、データアボート発生時の動作を変更しています。APIの詳細は、 ベクタ を参照してください。

注釈

独自の例外ハンドラを登録した場合は、自動的にプログラムが停止し要因を表示する機能は使用できません。

/* APIを使用するために solid_vecotr.h をインクルードします */
#include <solid_vector.h>

/* データアボートハンドラ */
static int my_dabort_handler(void* param, SOLID_CPU_CONTEXT* pContext)
{
    /* データアボート発生時の処理を記述 */
    return SOLID_ERR_OK;
}

void register_exceptions()
{
    SOLID_VECTOR_HANDLER myDAbortHandler;
    myDAbortHandler.func = &my_dabort_handler;
    myDAbortHandler.param = NULL;

    /* SOLID_VECTOR_DATAABORTを指定して、データアボート発生時の処理を登録する */
    SOLID_VECTOR_Register(SOLID_VECTOR_DATAABORT, &myDAbortHandler);

    /* ...他の例外ハンドラの登録 */
}