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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。