C で「サービス ルーチンへのベクトル」を実装する際に問題があります。
現在、I2C インターフェイスの IRQ ハンドラーを次のように実装しています。
void I2C0_IRQHandler(void)
{
statusCode = LPC_I2C->STAT;
switch ( statusCode ) { (...) }
}
多くのステータス コードを使用すると、すべてのケースを確認する必要があるため、これは遅くなります。
LPC12xx マイクロコントローラのユーザー マニュアルにヒントがあります。
ステータス コードがサービス ルーチンへのベクトルとして使用される場合、ルーチンは 8 つのアドレス ロケーションによって置き換えられます。ほとんどのサービス ルーチンでは、8 バイトのコードで十分です。
したがって、それぞれ正確に 8 バイトのコード サイズでいくつかのハンドラー関数を記述し、それらを正しいメモリ位置に配置する必要があります。
0xABCDEF00: handler_for_code_0x00
0xABCDEF08: handler_for_code_0x08
(...)
0xABCDEF90: handler_for_code_0x90
割り込みハンドラで私は
- ステータス コードをメモリ オフセット (ここでは 0xABCDEF00) に追加します。
- このアドレスを関数ポインタにキャストします
- そして関数を呼び出します。
私はこれの権利を持っていますか?これをCでどのように実装できますか?