3

EABI 組み込み PowerPC アプリケーションで 0x500 外部/デクリメンタ例外を処理するアセンブラ ルーチンを作成しています。

0x500 ベクトル ポイントから呼び出されたアセンブラー ルーチンで、'C' のハンドラー関数に分岐する前に、コンテキスト保存レジスターにメモリを使用したいと考えています。

i) 例外モデルは、例外ハンドラが実行されるまでに前の命令が終了することを保証し、かつ ii) 呼び出し規約は、解放された新しいスタック領域を使用する前に、新しい関数に入ると最初にスタック ポインタ (r1) を更新するように見えるためです。それを移動することによって(そしてスタックポインタを関数の最後にあった場所に戻します)

r1 を安全に使用して、例外処理ルーチンの通常のスタックに余裕を持たせることができるように思えます。ただし、明らかに呼び出し規約を順守し、スタックを見つけた方法に戻し、SRR0 と SRR1 が確実に使用されていることを確認する必要があります。無修正。

処理でスタックを使用する例外を入れ子にすることは許可しません (ただし、実際にこの方法を使用しても問題があるかどうかはわかりません)。

これは賢明なアプローチだと思いますか、それとも例外処理に別のスタックを使用する必要がありますか? - これは、それ自体の問題をもたらす可能性があると考えています。

4

3 に答える 3

5

組み込みシステムは、これを両方の方法で行います。スタック ポインタが常に有効なフレームを指し、スタックに新しいフレーム用のスペースがあることが完全に確信できる場合は、先に進んでそれを使用してください。スタック ポインターが常に有効であるとは限らない可能性がある場合は、古いスタック ポインターを (通常は SPRG に) 保存し、独自のスタック ポインターを設定する必要があります。

ソフトウェア エラーを検出するためにデータ アクセス例外を処理する場合は、スタック ポインターの破損が原因で DACC が発生した可能性があるため、独自の例外スタックを設定する必要があります。

于 2009-09-28T23:15:34.113 に答える
1

レジスタコンテキストをスタックに保存することで私が見ることができる唯一の欠点は、遭遇する可能性のある例外の1つがスタックオーバーフローであるということです。

于 2009-09-28T19:53:14.763 に答える
1

現在のコンテキストを現在のスタックに問題なく保存しました。

戻りたい例外と、戻りがない、またはそのスタックが信頼できない「致命的な失敗」である例外を区別する必要があります。戻らない場合、選択肢は 2 つあります。スタックを再起動してすべてを破棄するか、より多くの RAM がある場合は例外スタックに切り替えて、通常のスタックを印刷できるようにするか ...

于 2009-09-30T06:19:02.377 に答える