では皆さん、
ARM アセンブリに慣れようとしていますが、割り込みの概念がよくわかりません。これに先立って、私は AVR 割り込みを扱ってきました。コードは、割り込みベクトルを、ジャンプ先のサブルーチンまたはセグメントに明示的にリンクするように記述されていました。
.ORG $0022
RJMP TIMER_INTERRUPT
しかし、Atmel SAMA5D3 シリーズを使用する際に、同様のことを行う方法がわかりません。最初の 8 つの割り込みベクトルが最初の 8 つのプログラム カウンター アドレス ( reset
at0x00
からfiq
at 0x1C
) にあることは理解していますが、個々の周辺機器がどのように割り込みを行うかについて、適切で実用的でわかりやすいリソースを見つけることができませんでした。 (SPI、UART、TC モジュール) は、標準化された ARM ベクトル テーブルにマップされます。
つまり、割り込みをスローできるように UART を構成するコードを想定します。割り込みをスローするとどうなりますか? irq
エントリのアドレス( 0x18
) には、デバイス固有のベクトルのテーブルの場所が含まれていますか? ベンダー固有およびデバイス固有のペリフェラルは、コア標準化テーブルを介してどのように割り込みをアサートしますか?
私は SAMA5D3 と ARM ARM のデータシートを調べましたが、初心者にとって簡単なものはあまり見つかりませんでした。何か不明な点があればお詫び申し上げます。また、アセンブリを避けたことは世界に恥をかかせます。
編集:
SAMA5D3 データシートの 118 ページには、次のように記載されています。
次のことが想定されます。
- 高度な割り込みコントローラがプログラムされ、AIC_SVR レジスタに対応する割り込みサービス ルーチン アドレスがロードされ、割り込みが有効になります。
- ベクトル化を使用するには、ARM 割り込み例外ベクトル アドレスの命令が必要です。
LDR PC, [PC, # -&F20]
がアサートされたとき
nIRQ
、 のビット「I」CPSR
が 0 の場合、シーケンスは次のようになります。
- は
CPSR
に格納されSPSR_irq
、プログラム カウンタの現在の値は割り込みリンク レジスタ (R14_irq
) にロードされ、プログラム カウンタ (R15
) には 0x18 がロードされます。アドレス 0x1C でのフェッチ中の次のサイクルで、ARM コアは を調整しR14_irq
、それを 4 だけ減らします。- ARM コアは、まだ割り込みモードに入っていない場合は、割り込みモードに入ります。
- アドレス 0x18 にロードされた命令が実行されると、プログラム カウンタに で読み取られた値がロードされ
AIC_IVR
ます。
これは理解できます。これを読んでレジスタ番号を見ると、周辺機器の割り込みソース (つまりSPI0/1
) 番号を のINTSEL
フィールドに入れるAIC_SSR
と、ISR のアドレスを に格納するように聞こえますAIC_SVR
。
2 つの問題があります。そのうちの 1 つは、存在する必要があり、 のベクトル アドレスLDR PC, [PC, # -&F20]
と互換性がある必要があるベクトル化命令 ( ) を理解していないことです。irq
0x18
もう 1 つの問題は、複数の割り込みを有効にする方法です。フィールドとソース ベクタ レジスタは 1 つしかないINTSEL
ので、このシステムで複数の割り込みハンドラを実行するにはどうすればよいでしょうか?
皆さん、私がこれを理解していない場合は、引き続きお詫び申し上げますが、少なくとも宿題をしようとしています.