0

では皆さん、

ARM アセンブリに慣れようとしていますが、割り込みの概念がよくわかりません。これに先立って、私は AVR 割り込みを扱ってきました。コードは、割り込みベクトルを、ジャンプ先のサブルーチンまたはセグメントに明示的にリンクするように記述されていました。

.ORG $0022                     
     RJMP TIMER_INTERRUPT

しかし、Atmel SAMA5D3 シリーズを使用する際に、同様のことを行う方法がわかりません。最初の 8 つの割り込みベクトルが最初の 8 つのプログラム カウンター アドレス ( resetat0x00からfiqat 0x1C) にあることは理解していますが、個々の周辺機器がどのように割り込みを行うかについて、適切で実用的でわかりやすいリソースを見つけることができませんでした。 (SPI、UART、TC モジュール) は、標準化された ARM ベクトル テーブルにマップされます。

つまり、割り込みをスローできるように UART を構成するコードを想定します。割り込みをスローするとどうなりますか? irqエントリのアドレス( 0x18) には、デバイス固有のベクトルのテーブルの場所が含まれていますか? ベンダー固有およびデバイス固有のペリフェラルは、コア標準化テーブルを介してどのように割り込みをアサートしますか?

私は SAMA5D3 と ARM ARM のデータシートを調べましたが、初心者にとって簡単なものはあまり見つかりませんでした。何か不明な点があればお詫び申し上げます。また、アセンブリを避けたことは世界に恥をかかせます。

編集:

SAMA5D3 データシートの 118 ページには、次のように記載されています。

次のことが想定されます。

  1. 高度な割り込みコントローラがプログラムされ、AIC_SVR レジスタに対応する割り込みサービス ルーチン アドレスがロードされ、割り込みが有効になります。
  2. ベクトル化を使用するには、ARM 割り込み例外ベクトル アドレスの命令が必要です。

LDR PC, [PC, # -&F20]

がアサートされたときnIRQ、 のビット「I」CPSRが 0 の場合、シーケンスは次のようになります。

  1. CPSRに格納されSPSR_irq、プログラム カウンタの現在の値は割り込みリンク レジスタ ( R14_irq) にロードされ、プログラム カウンタ ( R15) には 0x18 がロードされます。アドレス 0x1C でのフェッチ中の次のサイクルで、ARM コアは を調整しR14_irq、それを 4 だけ減らします。
  2. ARM コアは、まだ割り込みモードに入っていない場合は、割り込みモードに入ります。
  3. アドレス 0x18 にロードされた命令が実行されると、プログラム カウンタに で読み取られた値がロードされAIC_IVRます。

これは理解できます。これを読んでレジスタ番号を見ると、周辺機器の割り込みソース (つまりSPI0/1) 番号を のINTSELフィールドに入れるAIC_SSRと、ISR のアドレスを に格納するように聞こえますAIC_SVR

2 つの問題があります。そのうちの 1 つは、存在する必要があり、 のベクトル アドレスLDR PC, [PC, # -&F20]と互換性がある必要があるベクトル化命令 ( ) を理解していないことです。irq0x18

もう 1 つの問題は、複数の割り込みを有効にする方法です。フィールドとソース ベクタ レジスタは 1 つしかないINTSELので、このシステムで複数の割り込みハンドラを実行するにはどうすればよいでしょうか?

皆さん、私がこれを理解していない場合は、引き続きお詫び申し上げますが、少なくとも宿題をしようとしています.

4

1 に答える 1

0

この特定のシステムについては、リンクされたドキュメントをざっと見ただけではわからないことは認めますが、十分に簡単に思えます。まず、CPU のことは忘れて、割り込みコントローラーに注目しましょう。

アドレス空間を浪費し、割り込みソースごとに別々の制御レジスタを複雑にマッピングするのではなく、ベクトルはコントローラの内部に保持されます。代わりに、その内部データへのウィンドウとして機能する単一のレジスタ セットと、制御するセレクタ レジスタを取得します。そのウィンドウが指している場所。したがって、構成シーケンスは次のようになります。

  1. に 2 を書き込むことにより、割り込み 2 を選択します。AIC_SSR
  2. 割り込み 2 の構成AIC_SMRとハンドラ アドレスを書き込みますAIC_SVR
  3. に 3 を書き込んで割り込み 3 を選択します。AIC_SSR
  4. 割り込み 3 の構成AIC_SMRとハンドラ アドレスを書き込みますAIC_SVR
  5. 等...

AIC_IVRプログラム可能なセレクターの代わりに、現在アクティブな割り込みによって制御されることを除いて、ウィンドウと同様に機能します。したがって、たとえば割り込み 3 が発生すると、AIC_IVR上記の手順 4 でプログラムしたアドレスとして読み取られます。

これで、CPU 側はかなり単純になりました。ARM 例外ベクトルのレイアウトは、各「ハンドラ」に 1 つの命令しかないことを意味することに注意してください。したがって、それらはほとんどの場合、別の場所にある本格的なハンドラ ルーチンへの分岐になります。例外の種類ごとに 1 つのハンドラーがあるため、IRQ がアサートされると、CPU は単に「IRQ」アドレスにジャンプします0x18。ここで、外部割り込みベクタリングの出番です。割り込みコントローラにはすでにすべての詳細が含まれているため、CPU は、この IRQ がどの割り込み用で、何をすべきかを判断するために最上位の IRQ ハンドラを必要としません。に表示されているアドレスをロードAIC_IVRし、それにジャンプすると、正しい割り込み固有のハンドラーになります。

これは、「IRQ ハンドラー」を魔法の命令に減らすことができることを意味します。「魔法」とは、AIC_AVRアドレス ( ) が PC 相対ロード用の CPU の例外ベクトルに十分に近いことです (アドレス ラップアラウンド0xFFFFF100のおかげです)。LDRPC は、単一の例外ベクトル命令自体からアドレス ロードと分岐の両方を実行できるため、レイテンシが最小限に抑えられます。

もちろん、そのようにする必要はないかもしれません.

/* exception vectors */
.org 0
  b    start
  ...
  b    handle_irq
  ...

handle_irq:
  push {r0}
  ldr  r0, =fffff100
  ldr  r0, [r0]
  b    r0
于 2014-09-23T03:17:51.807 に答える