MIPSfpgaと割り込み

この記事では、MIPS32リリース2割り込みの構成と使用のいくつかの例を提供します。これには、これで設定される構成の詳細な説明や、外部割り込みコントローラーの操作方法が記載されています。







説明されているすべてのコードは、mipsfpga-plus [ L3 ]プロジェクトの一部としてgithubで公開されています。







画像







はじめに



読者は:









この記事を書くことにより、MIPS microAptivコアの割り込みを処理するすべての機能を包括的に述べるつもりはありません。 これには、ドキュメントの大規模な翻訳と、ほぼ同じ量のコメントが必要です。 目標は、下位互換性、ベクトル、外部コントローラーの使用の3つの可能なモードで割り込みを構成および使用する実例を示すことです。 したがって、読者がより快適に感じるために、ドキュメントの次のセクションをすぐに理解することをお勧めします。









すべての例で、わかりやすくするために、シミュレーターで実行されるシステムmipsfpga-plusでの起動について説明しています。 同様に成功した場合、これはハードウェアでも実行できます。コード全体の機能は、Terasic DE10-Lite [ L4 ]ボードでテストされました。







受け入れられた指定



信号の名前はイタリック体( SI_Int [7:0] )で示されていますが、特に指定がない限り、すべての信号はMIPSfpgaシステムの上位モジュール(m14k_top)のインターフェースです。 レジスタの場合、飽和フォント( Count )が使用され、個々のビット(フィールド)の名前は、関連するレジスタを示すドット( Cause.DC )で示されます。ドキュメントの個別のコピーでは、レジスタフィールドは下付き文字( Cause IV )で示されます。 すべてのレジスタについて、これが別に指定されていない場合、幅x32が想定されます。 ドキュメントのコピーで定数を指定する場合、記号「ポンド」の前に番号システムの指示があります(16#180、2#00001)。







なぜなら 残念ながら、オプション「GPR Shadow Registers」(Shadow Register Set、SRS)はMIPSfpgaでは利用できないため、この記事では汎用シャドウレジスタに関する詳細を省略しています。 この機能がダイアグラム上にある場合-灰色(色あせた)色で反映されます。







例外処理



例外は、プロセッサがカーネルモードに切り替わるすべてのイベントとして理解されます:外部デバイスからの割り込み要求を含む、メモリアクセスエラー、ゼロ除算など。 考えられるすべての例外の処理は広範なトピックであり、オペレーティングシステム(OS)のカーネルから切り離して正しく考慮することはできません。これは明らかにこの記事の範囲外です。 ただし、OSの使用が意図されていない場合でも(ベアメタルコード)、開発者はメモリ内に最小限のハンドラーセットを提供して、例外の発生について学習し、「任意の水泳」でのプログラムの実行を防止する必要があります。







ハンドラーアドレス決定アルゴリズムをわずかに短縮
if Status.EXL = 1 then vectorOffset ← 16#180 else if ExceptionType = TLBRefill then vectorOffset ← 16#000 elseif (ExceptionType = Interrupt) then //      if (Cause.IV = 0) then vectorOffset ← 16#180 else if (Status.BEV = 1) or (IntCtl.VS = 0) then vectorOffset ← 16#200 else if Config3.VEIC = 1 then VecNum ← Cause.RIPL else VecNum ← VIntPriorityEncoder() endif vectorOffset ← 16#200 + (VecNum × (IntCtl.VS || 2#00000)) endif endif endif endif Cause.ExcCode ← ExceptionType //  ,          Status.EXL ← 1 //   ,    " " if Status.BEV = 1 then vectorBase ← 16#BFC00200 else //   EBase[31:30] = 2'b10 //       kseg0  kseg1 vectorBase ← EBase[31:12] || 16#000 endif //     //      vectorBase  vectorOffset //    29   30     PC ← {vectorBase[31:30], (vectorBase[29:0] + vectorOffset[29:0])}
      
      





上記のアルゴリズムでは、次の点は考慮されません。









例外の詳細は[ D2 ]にあります。







したがって、割り込みを使用しなくても、開発者は次のオフセットに例外ハンドラがあることを確認する必要があります。









割り込み処理モード



それらの3つだけがあります。









デフォルトでは、プロセッサは互換モードで起動します。 将来的には、ビット(フィールド)の対応する値を設定することで変更できます。









リストされたビット(フィールド)とそれらが関連するレジスタの詳細な説明はドキュメントに記載されています。これらの値の合計が割り込み処理モードに与える影響に注意してください。







画像







システムタイマー



割り込みの処理の説明に進む前に、最も頻繁に発生するソースの1つであるシステムタイマーについて考えてみましょう。 その機能は非常にシンプルですが、プロセッサコアの一部であり、省エネモードで動作することもできるため、どの環境でも使用できます。







これを使用するには、2つのレジスタが使用されます。









これらのレジスタを使用するには、mips / cpu.hで宣言されているmips32_setcompareおよびmips32_setcountマクロを使用してタイマーを初期化およびリセットすると便利です。実際には、同じコード[ S0 ]が使用されます。







 mips32_setcompare(MIPS_TIMER_PERIOD); //set compare (TOP) value to turn on /reset timer mips32_setcount(0); //reset counter
      
      





下のスクリーンショットは、割り込み処理中のタイマーの初期化とリセットの瞬間を示しています。







画像







SI_TimerInt信号の存在は、割り込みを引き起こすには不十分です。 処理するためには、RTLレベルで正しくルーティングする必要があります。RTLレベルは、以下で説明する現在の割り込みモードに依存します。







割り込み互換モード



MIPS32リリース1との下位互換性モード。主な機能:









比較的最近のマイクロコントローラーでの組み込みシステムの開発で初めての経験をした人は、例外の大部分を含む、すべての「わずか」6個の外部割り込みと1つの共通プロセッサーに戸惑うかもしれません。 ここでは、MIPSアーキテクチャのいくつかの歴史を考慮する必要があります。割り込みソースは階層的に接続されると想定され、割り込みへの(からの)入力コードはすべてのハンドラーに共通であると見なされました。 外部デバイスは本質的に低速であるため(イベントはほとんど発生しません)、ソースと優先度の「手動」チェックによる特別なパフォーマンスの損失はなく、可能な最適化の余地さえあります。 [ L5 ]からのそのような接続の例を以下に示します。







画像







これらの機能が「欠点」と見なされた場合でも、MIPSfpgaプロセッサコアの対応するインターフェイスを介して接続された外部割り込みコントローラーを使用する可能性により、対応するセクションで簡単に補償されます。









起動順序





 `define MFP_USE_WORD_MEMORY //`define MFP_USE_IRQ_EIC
      
      







プログラムとシステム構成の説明





画像







ベクタ割り込みモード



ベクトル割り込み処理モード。







画像







主な機能:









画像









画像









起動順序





 #define RUNTYPE VECTOR
      
      





プログラムとシステム構成の説明





画像







外部割り込みコントローラーモード



外部割り込みコントローラー



画像







外部割り込みコントローラーモードでの操作の説明に進む前に、このモジュールがプロセッサーコアとどのように相互作用するか、そしてそれが何であるかを検討します。

コントローラのタスクは、外部割り込みを登録し、それらの最高優先順位に関する情報をバスに発行することです(割り込みインターフェイス)。









次の割り込み要求を処理に取り込むと、プロセッサーはコントローラーに次のように伝えます。









コントローラとプロセッサコア間の一般的な相互作用を以下に示します。







画像







次のことも考慮する必要があります。









 assign eic_offset = 1'b1;
      
      







MIPSfpga-plus割り込みコントローラー



主な機能:









 `ifdef MFP_USE_IRQ_EIC .EIC_input ( EIC_input ), .EIC_Offset ( SI_Offset ), .EIC_ShadowSet ( SI_EISS ), .EIC_Interrupt ( SI_Int ), .EIC_Vector ( SI_EICVector ), .EIC_Present ( SI_EICPresent ), .EIC_IAck ( SI_IAck ), .EIC_IPL ( SI_IPL ), .EIC_IVN ( SI_IVN ), .EIC_ION ( SI_ION ), `endif //MFP_USE_IRQ_EIC
      
      





コントローラーには次のファイルが含まれます。









コントローラー構成の一般的な考え方を形成するために、構成レジスターとその完全な説明を[ D5 ]にリストします。 EICREISMSK_0およびEISMSK_1を除くすべてのレジスタでは、ビット番号がコントローラーの入力番号に対応すると想定されています。 したがって、たとえば、 EIFR_0 [3] = 1-入力3は未処理の割り込みを予期することを意味します。







画像









起動順序





プログラムとシステム構成の説明





画像









画像









, , .. [ L7 ]. .



[ D3 ] , :







 void __attribute__ ((interrupt)) v0 (); void __attribute__ ((interrupt, use_shadow_register_set)) v1 (); void __attribute__ ((interrupt, keep_interrupts_masked)) v2 (); void __attribute__ ((interrupt, use_debug_exception_return)) v3 (); void __attribute__ ((interrupt, use_shadow_register_set, keep_interrupts_masked)) v4 (); void __attribute__ ((interrupt, use_shadow_register_set, use_debug_exception_return)) v5 (); void __attribute__ ((interrupt, keep_interrupts_masked, use_debug_exception_return)) v6 (); void __attribute__ ((interrupt, use_shadow_register_set, keep_interrupts_masked, use_debug_exception_return)) v7 (); void __attribute__ ((interrupt("eic"))) v8 (); void __attribute__ ((interrupt("vector=hw3"))) v9 ();
      
      





:









(interrupt, keep_interrupts_masked)
 void __attribute__ ((interrupt, keep_interrupts_masked)) __mips_isr_sw0 () { 80001544: 401b7000 mfc0 k1,c0_epc 80001548: 27bdfff0 addiu sp,sp,-16 8000154c: afbb000c sw k1,12(sp) 80001550: 401b6000 mfc0 k1,c0_status 80001554: afbb0008 sw k1,8(sp) //  k1    status.exl,.erl,.um, .ie; 80001558: 7c1b2004 ins k1,zero,0x0,0x5 // status 8000155c: 409b6000 mtc0 k1,c0_status 80001560: afbe0004 sw s8,4(sp) 80001564: 03a0f025 move s8,sp ... } 80001568: 03c0e825 move sp,s8 8000156c: 8fbe0004 lw s8,4(sp) 80001570: 8fbb000c lw k1,12(sp) 80001574: 409b7000 mtc0 k1,c0_epc 80001578: 8fbb0008 lw k1,8(sp) 8000157c: 27bd0010 addiu sp,sp,16 80001580: 409b6000 mtc0 k1,c0_status 80001584: 42000018 eret
      
      







(interrupt)
 void __attribute__ ((interrupt)) __mips_isr_hw5 () { 80001588: 401a6800 mfc0 k0,c0_cause 8000158c: 401b7000 mfc0 k1,c0_epc 80001590: 27bdfff0 addiu sp,sp,-16 80001594: afbb000c sw k1,12(sp) 80001598: 401b6000 mfc0 k1,c0_status //   k0  cause.ip7-ip2 8000159c: 001ad282 srl k0,k0,0xa 800015a0: afbb0008 sw k1,8(sp) //  k1  cause.ip6-ip2   status.im7-im2 800015a4: 7f5b7a84 ins k1,k0,0xa,0x6 //  k1    status.exl,.erl,.um; // .ie     ( 1) 800015a8: 7c1b2044 ins k1,zero,0x1,0x4 // status 800015ac: 409b6000 mtc0 k1,c0_status 800015b0: afbe0004 sw s8,4(sp) 800015b4: 03a0f025 move s8,sp ... } 800015b8: 03c0e825 move sp,s8 800015bc: 8fbe0004 lw s8,4(sp) //disable interrupts (status.ie = 0) 800015c0: 41606000 di 800015c4: 000000c0 ehb 800015c8: 8fbb000c lw k1,12(sp) // epc 800015cc: 409b7000 mtc0 k1,c0_epc 800015d0: 8fbb0008 lw k1,8(sp) 800015d4: 27bd0010 addiu sp,sp,16 // status   800015d8: 409b6000 mtc0 k1,c0_status 800015dc: 42000018 eret
      
      







謝辞



« », Imagination Technologies YuriPanchul MIPSfpga.







参照資料



[L1] — ;

[L2] — MIPSfpga ;

[L3] — MIPSfpga-plus github ;

[L4] — FPGA Terasic DE10-Lite ;

[L5] — Embedded Linux System Design and Development P. Raghavan, Amol Lad, Sriram Neelakandan ( );

[L6] — ahb_lite_eic github ;

[L7] — Codescape MIPS SDK ;







ドキュメント



[D1] — MIPS32 microAptiv UP Processor Core Family Integrator's Guide ;

[D2] — MIPS32 microAptiv UP Processor Core Family Software User's Manual ;

[D3] — Codescape GNU Tools for MIPS Programmer's Guide ;

[D4] — MIPS32 Architecture For Programmers Volume III: The MIPS32 Privileged Resource Architecture ;

[D5] — MIPSfpga+ External Interrupt Controller ;

[D6] — MIPS32 microAptiv UP Processor Core Family Datasheet ;









[P0] — MIPS 32 microAptiv UP Core Block Diagram (: D6 );

[P1] — ;

[P2] — MIPS. ();

[P3] — (: L5 );

[P4] — . ();

[P5] — (: D2 );

[P6] — (: D2 );

[P7] — (: D2 );

[P8] — . ();

[P9] — (: D2 );

[P10] — (: D1 );

[P11] — (: L6 );

[P12] — , ();

[P13] — , ().









[S0] — ;

[S1] — mipsfpga-plus ;

[S2] — 06_timer_irq ;

[S3] — mipsfpga-plus ;

[S4] — ;

[S5] — ;

[S6] — ;

[S7] — ;

[S8] — ;

[S9] — ;

[S10] — main 06_timer_irq ;

[S11] — ;

[S12] — ;

[S13] — ;

[S14] — ;

[S15] — mipsfpga-plus ;

[S16] — mipsfpga-plus ;

[S17] — ;

[S18] — ;

[S19] — ;

[S20] — AHB-Lite ;

[S21] — ;

[S22] — HW63 ;

[S23] — ;

[S24] — ;

[S25] — 外部割り込みのコントローラーモードでのベクトルオフセット増分の設定

[S26]- 外部割り込みのコントローラーモードでの割り込みハンドラー

[S27]- マクロISRおよびEH_GENERAL ;

[S28]- モジュールinterrupt_sence ;

[S29]-interrupt_channel モジュール








All Articles