2012/04/18

[arm]LPC-2388のIRQからVICVectAddrXを使う

FeliCa PlugをARM LPC-2388から操作するには、SPIを使うことになる。
しかし、その前にやりたいことがあった。

割り込みハンドラの整理だ。
FIQを使っていたのだけど、ハンドラに飛んでからswitch-caseなどで分岐するのはあまり効率が良くない。
せっかくのFIQなのだから、そういうのはもっと高速な用途のために空けておき、そこまで速度がいらないものはIRQでやってしまうといいんではなかろうか。

 

と思ったことにしたいが、実は少し違う。
ARMの割り込み処理をネットで探していたら、VICVectAddr0などを使う例があったのだ。

VICが使えるARMの場合、VICVectAddrX(Xは該当する番号)に値を入れておくと、該当する割り込みが発生したときにVICVectAddrレジスタにVICVectAddrXの値が入っている、というようになっているらしい。

これを使うときは、こういうのが多い。

  • 割り込みハンドラが呼び出されてからVICVectAddrレジスタを読み取り、そこへ関数ジャンプする。
  • 割り込みハンドラとしてVICVectAddrレジスタの値を使う

どっちかを選べといわれたら、後者の方が手間が少なくてよさそうだろう?
私はそう思ったのだ。


しばらく試してわかったのは、VICVectAddrレジスタを使うしくみはFIQではなくIRQでのみ有効、ということ。

 

最後までわからなかったのは、割り込みハンドラ呼び出し前のPCとVICVectAddrの関係。
最初に見たサンプルをそのまま使っていたのだが、IRQのベクタが

LDR     PC, [PC, #-0x0FF0]

となっていたのだ。
でも、-0x0FF0では大きすぎたのだな・・・。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。