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 ]にリストしたす。 EICR 、 EISMSK_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 モゞュヌル。



Source: https://habr.com/ru/post/J324900/


All Articles