FC2 Analyzer

Raisonance Ride7 & ARM Tools (17) LPC2xxx の Startup (2)2012年09月25日 19時35分42秒

さて、それでは本題に入っていこう。
Raisonance の Startup を使ってうまくいかない原因のひとつはエントリー部分に割り込み専用の処理がしてあるにもかかわらず __attribute__ ((interrupt("IRQ"))) などを使ってしまうことだ。従って、割り込みエントリーを使うなら属性指定をしてはならない。

もうひとつの原因はエントリー部分からハンドラをコールしなければならないにもかかわらずジャンプしてしまっていることだ。よって、コールに変更する。

さらにもうひとつあげるとするなら Raisonance の場合、通常スタートアップは $(RkitLib)\ARM\ から crt0_LPC23x.o の形でリンクするのでハンドラを weak 指定にしたほうがよい、といったところだろうか。

まずは IRQ を使った割り込み。
① main_irq1.c

 

割り込みが入ると IRQ_Handler をコールしてくるのでこの関数の中で割り込み先を特定し、さらにそこへ分岐していく。

次に、VicVectAddr を使った割り込み。
② main_irq2.c

 

同じ IRQ 割り込みでも VICVectAddr に予め関数を登録しておけば割り込み先を特定する作業をすることなく呼び出すことができる。

続いて FIQ を使った割り込み。
③ main_fiq.c

 

① の IRQ 割り込みと似ている。

最後は VICVectAddr をベクターテーブルに組み込んだ割り込み。
この時 crt0_LPC23x.s は以下の変更をする。
    ldr     PC, [PC, #-0x0120] これを有効にして(lpc21x Lpc22x の場合は 0x0FF0)
    ldr     PC, =IRQHandler  これをコメントにする。
この方法は Startup のエントリー部分を使わないので割り込み処理ルーチンに __attribute__ ((interrupt("IRQ"))) が必要だ。
④ main_vic.c

 

ベクターテーブルからいきなり VICVectAddr を参照する。

見たところ④の方法がすっきりして無駄がないように見える。
後試してみたいのは SWI_Handler だがどのようにして試そうか思案中だ。

環境:CQ-FRK-NXP-ARM
    + Ride7 version 7.30.10.0169
    + RKit-ARM version 1.30.10.0356
    + GCC Sourcery CodeBench Lite 2012.03-56

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
このブログのタイトルは?(syslab と記入してください)

コメント:

トラックバック

このエントリのトラックバックURL: http://syslab.asablo.jp/blog/2012/09/25/6585047/tb

FC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンター FC2無料カウンターFC2無料カウンター