私はLPC2138 socを使用して、ベアメタルのARMプロジェクトを開発中です。私はI2C用のIRQ割り込みハンドラを書いています。しかし、それは正しく返されません。ハンドラは、単一の割り込みに対して繰り返し呼び出されています。GCCでARM IRQハンドラが正しく動作しない
私はこの問題の詳細なデバッグ分析を行っています。
ARM7TDMIリファレンスマニュアルには、次のことが明確に記載されています。
しかし、コードを逆アセンブルすると、GCCによって生成されたコードがCPSRレジスタを復元しないことがわかりました。また、最後には未知の値です。
私は、次の
void I2C0_IRQ_handler(void) __attribute__ ((interrupt("IRQ")));
などのIRQハンドラは、SこれはGCCのバグですか、私は何か間違ったことをしたのか宣言していますか
私はプロジェクトを構築するために使用しているコンパイラ、アセンブラ、リンカフラグは次のとおりです。
CFLAGS := -mcpu=arm7tdmi-s -g3 -Wall -I. -gdwarf-2
AS_FLAGS := -mcpu=arm7tdmi-s -g3 -gdwarf-2
LD_FLAGS := -Wl,-Map,$(TARGET:%.hex=%).map -nostartfiles
どのように正しく動作しないのですか。あなたはあなたが期待しているものと比べてどのような行動を見ますか?'VICVectAddr = 0;'が割り込みをクリアしていると仮定すると、このコードは3つの引用符で囲まれたすべてのステップを適切に実行しています(ヒント: 'subs pc、...'が実際に何を実行しているかを読む) – Notlikethat
@Notlikethat I2Cの開始条件が生成する必要があります。その働き。しかし、割り込みルーチンの後、コントロールは中断されたコードに戻りません。アセンブリコードにステップ2がありません。 – sreeyesh
私が言ったように、ステップ2_is_はそのコードで 'subs pc ...'によって実行されます。 LPC213xのマニュアルを見つけて、VICで割込みを確認していますが、割込みは明らかにレベルでトリガされています.I2Cコントローラのエンドで割込みを行うことは何もしていません(13.9節参照)。したがって、あなたが戻ってくると、ただちに同じ割り込みをもう一度やり直して、無限になります。 – Notlikethat