6.12.2. 複数のハンドラのチェイン

場合によっては複数のハンドラが必要になるときがあります。標準の Angel デバッガを実行し、複数の SVC をサポートさせたいスタンドアロンのユーザアプリケーション(または RTOS)をダウンロードするとします。新たにロードされるアプリケーションに、インストール可能な完全に独立した例外ハンドラが備わっている場合でも、Angel ハンドラを置き換えることはできません。

この場合は、新しいハンドラが例外のソースを処理できないことを認識した場合に古いハンドラを呼び出せるように、古いハンドラのアドレスが記録される必要があります。例えば、RTOS SVC ハンドラは、SVC が RTOS SVC でないことを検出すると Angel SVC ハンドラを呼び出すため、Angel SVC ハンドラによってその SVC を処理できます。

この方法をいくつものレベルに拡張してハンドラのチェインを作成することができます。この方法を用いるコードでは、各ハンドラを完全に独立させることが可能ですが、1 つのハンドラを使用するコードに比べると効率が悪く、必要以上にハンドラのチェインを伸ばすことによって効率は低下します。

C 言語からのハンドラのインストールで示したルーチンは両方とも、ベクタの古い内容を返します。この値をデコードすることによって以下を取得できます。

分岐命令のオフセット

このオフセットを使用して元のハンドラの位置を計算し、新しい分岐命令を作成してメモリ内の適切な位置にストアできます。代用ハンドラが例外処理に失敗すると、作成された分岐命令に分岐し、その命令が元のハンドラに分岐します。

元のハンドラのアドレスが格納される位置

アプリケーションハンドラは例外処理に失敗すると、その位置からプログラムカウンタをロードする必要があります。

デバッグモニタまたは RTOS ハンドラ上の情報が利用できるので、ほとんどの場合でこのような計算は必要ありません。計算が必要な場合は、次のハンドラ内でチェインする必要のある命令をアプリケーションにハードコーディングできます。このハンドラの最後のセクションで、例外の原因が処理されたことをチェックする必要があります。処理が完了していれば、ハンドラはアプリケーションに戻ることができます。処理されていなければ、チェイン内の次のハンドラを呼び出す必要があります。

Note

デバッグモニタハンドラの前のハンドラにチェインする場合、モニタをシステムから外すときはこのチェインを外し、アプリケーションハンドラを直接インストールする必要があります。

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential