さて、それでは本題に入っていこう。
Raisonance の Startup を使ってうまくいかない原因のひとつはエントリー部分に割り込み専用の処理がしてあるにもかかわらず __attribute__ ((interrupt("IRQ"))) などを使ってしまうことだ。従って、割り込みエントリーを使うなら属性指定をしてはならない。
もうひとつの原因はエントリー部分からハンドラをコールしなければならないにもかかわらずジャンプしてしまっていることだ。よって、コールに変更する。
さらにもうひとつあげるとするなら Raisonance の場合、通常スタートアップは $(RkitLib)\ARM\ から crt0_LPC23x.o の形でリンクするのでハンドラを weak 指定にしたほうがよい、といったところだろうか。
まずは IRQ を使った割り込み。
@ main_irq1.c
割り込みが入ると IRQ_Handler をコールしてくるのでこの関数の中で割り込み先を特定し、さらにそこへ分岐していく。
次に、VicVectAddr を使った割り込み。
A main_irq2.c
同じ IRQ 割り込みでも VICVectAddr に予め関数を登録しておけば割り込み先を特定する作業をすることなく呼び出すことができる。
続いて FIQ を使った割り込み。
B main_fiq.c
@ の IRQ 割り込みと似ている。
最後は VICVectAddr をベクターテーブルに組み込んだ割り込み。
この時 crt0_LPC23x.s は以下の変更をする。
ldr PC, [PC, #-0x0120] これを有効にして(lpc21x Lpc22x の場合は 0x0FF0)
ldr PC, =IRQHandler これをコメントにする。
この方法は Startup のエントリー部分を使わないので割り込み処理ルーチンに __attribute__ ((interrupt("IRQ"))) が必要だ。
C main_vic.c
セコメントをする