このアンサーでは、MicroBlaze のユーザー ベクター例外機能がソフトウェアでどのように使用されるかを説明しています。また、その一般的な使用ケースを示すための簡単なコード例も含まれています。
MicroBlaze プロセッサは、ユーザー例外ベクターを呼び出して出力することができるユーザー例外を提供しています。
このアンサーでは、ソフトウェアからユーザー例外ハンドラーを宣言し呼び出す方法を説明します。
デフォルトでアドレス 0x8 にあるユーザー ベクターは、GNU コンパイラ ツールの crt0.o ファイルで定義されていて、_exception_handler と呼ばれる関数を呼び出します。
この関数は newlib ライブラリで定義されていますが、BSP のどこにでも使用されるわけではないので、コードにこの機能を直接インプリメントすることができます。
これは高位言語 (C、C++) やアセンブラで記述することができます。
ソフトウェアからユーザー例外を呼び出すには 2 つの方法があり、1 つは標準サブルーチンの呼び出し命令である bralid を使用する方法、もう 1 つは brki 命令を使用する方法です。
brki 命令には、自動的にブレークをディスエーブルにすることができるという利点があり、ひいては割り込みもします。
C で記述されているユーザー例外ハンドラーが brki を使用して呼び出される場合は、リターン前にハンドラーでブレークをイネーブルにしておく必要があります。
MicroBlaze のパラメーター C_USE_MSR_INSTR が 1 に設定されている場合は、これは msrclr 命令を使って実現できます。
また、ユーザー例外ハンドラーからリターンは、遅延スロットを使用した命令を使って呼び出しが行われていることを、通常は前提にしています。
これは brki の前に nop 命令を追加することで処理できます。
MMU がイネーブルになっている場合は、ユーザー例外ハンドラーは真の特権モードで実行されるので、オペレーティング システムのコール エントリ ポイントとして適切です。
例
C で記述されている簡単なコード例が 2 つあります。
これらの例ではハンドラーにメッセージが出力されますが、それはコード記述としては最良事例ではないので、ご注意ください。
図 1 bralid からの ハンドラーの呼び出し
#include <stdio.h>
#define CALL_USER_VECTOR asm("bralid r15,0x8 ; nop")
void _exception_handler ()
{
xil_printf("In user exception!\r\n");
}
)
{
xil_printf("Main: Calling user exception...\r\n");
CALL_USER_VECTOR;
xil_printf("Main: Done.\r\n");
return 0;
}
図 2 brki からのハンドラーの呼び出し
#include <stdio.h>
#define CALL_USER_VECTOR asm("brki r15,0x8 ; nop")
#define CLEAR_BIP asm(msrclr r0,8)
void _exception_handler ()
{
xil_printf("In user exception!\r\n");
CLEAR_BIP;
}
int main(
)
{
xil_printf("Main: Calling user exception using brki...\r\n");
CALL_USER_VECTOR;
xil_printf("Main: Done.\r\n");
return 0;
}
AR# 53823 | |
---|---|
日付 | 10/14/2014 |
ステータス | アクティブ |
種類 | 一般 |
ツール |