DM 642の中断学習

6019 ワード

非DSP/BIOSではCSL APIを用いて以下のように設定されている(DSP/BIOSではより簡潔に設定されている).
1.割込みサービスルーチンの作成
はい.cソースファイルにISR関数c_を記述するintXXは、次のような処理を中断するために使用されます.
interrupt void c_intXX (void)
{
           …;
}
注:ハードウェア割り込みの場合、XX=00~15です.
2.割り込みベクトルテーブルを初期化し、メモリセグメントの割り込みベクトルテーブルに対応する割り込みベクトルを配置する
まず、割り込みベクトルテーブルをメモリセグメントに配置し、cmdファイルで割り込みベクトルテーブルのメモリマッピングを構成できます.たとえば、次のようにします.
MEMORY
{
           VECTORS:         org = 00000000h,       len = 00000400h
           L2SRAM:            org = 00000400h,       len = 00100000h
           SDRAM:             org = 80000000h,       len = 10000000h
}
SECTIONS
{
           .vecs                  :>            VECTORS
           .data                  :>            L2SRAM
           .text                   :>            L2SRAM
           .switch               :>            L2SRAM
           .stack                 :>            L2SRAM
           .bss                    :>            L2SRAM
           .cinit                   :>            L2SRAM
           .far                     :>            L2SRAM
           .cio                     :>            L2SRAM
           .const                 :>            L2SRAM
           .sysmem             :>            SDRAM
           .tables                :>            L2SRAM
}
      
次に作成します.asmファイルは、割り込みベクトルテーブルの割り込みベクトルを構成するために使用されます.他のソースファイルがこれらの変数を参照したり、他のソースファイルの変数を参照したりできるように、グローバル変数を宣言する必要があります.たとえば、次のようにします.
   .global _vectors    
       .global _c_int00    
       .global _vector1 
       .global _vector2
       .global _vector3
       .global _vector4
       .global _vector5
       .global _vector6
       .global _vector7
       .global _c_int08      ; main()関数に対応するc_int 08割込みサービスルーチン(処理がEDMA割込みであると仮定)
       .global _vector9        
       .global _vector10
       .global _vector11  
       .global _vector12 
       .global _vector13  
       .global _vector14  
       .global _vector15  
             
rtsの_を引用したのでc_int 00割り込み、すなわちRESET割り込みであるため、この記号を導入する必要がある.
   .ref      _c_int00
      
割り込みサービスルーチンのアドレス、すなわち割り込みベクトルを割り込みベクトルテーブルに挿入するために、マクロを定義することができる.
VEC_ENTRY .macro addr
        STW       B0,*--B15
        MVKL      addr,B0
        MVKH      addr,B0
        B         B0
        LDW       *B15++,B0
        NOP       2
        NOP  
        NOP  
.endm        
          
割り込みベクトルテーブルの割り込みベクトルを初期化するには、仮想割り込みベクトルを定義します.
_vec_dummy:
      B        B3
      NOP      5
          
次に、割り込みベクトルテーブルを構成できます.
.sect “.vecs”
.align 1024
_vectors:
_vector0:       VEC_ENTRY _c_int00          ;RESET割込み
_vector1:       VEC_ENTRY _vec_dummy ;NMI非シールド割込み
_vector2:       VEC_ENTRY _vec_dummy ;予約割込み1
_vector3:       VEC_ENTRY _vec_dummy ;予約割込み2
_vector4:       VEC_ENTRY _vec_dummy ;外部割込みINT 4
_vector5:       VEC_ENTRY _vec_dummy ;外部割り込みINT 5
_vector6:       VEC_ENTRY _vec_dummy ;外部割り込みINT 6
_vector7:       VEC_ENTRY _vec_dummy ;外部割込みINT 7
_vector8:       VEC_ENTRY _c_int08 ; EDMAコントローラはEDMAINTを中断し、c_に対応するint08 ISR
_vector9:       VEC_ENTRY _vec_dummy;JTAGRTDX割込み
_vector10:      VEC_ENTRY _vec_dummy;EMIF_SDRAM_Timer割込み
_vector11:      VEC_ENTRY _vec_dummy;McBSP_0_Receive割込み
_vector12:      VEC_ENTRY _vec_dummy;McBSP_1_Transmit割り込み
_vector13:      VEC_ENTRY _vec_dummy;Host_Port_Host_to_DSP割り込み
_vector14:      VEC_ENTRY _vec_dummy;Timer 0割り込み
_vector15:      VEC_ENTRY _vec_dummy;Timer 1割り込み
3.Cプログラムで定義された割込みベクトルテーブルを指定し、CPU割込み機能を有効にする
CプログラムではCSLのIRQモジュールで割込みを設定するのが便利で、設定する前に外部リンクの上のasmプログラムの割込みベクトルテーブル記号が必要です.
extern far void vectors();//vectorsとは、Cコンパイラがコンパイルされると自動的に_と名前が変わるためです.vectors
割り込みベクトルテーブルを参照すると、割り込みを設定できます.
        IRQ_setVecs(vectors);//asmで定義された割り込みベクトルテーブルを指す
        IRQ_nmiEnable();
        IRQ_globalEnable();
        IRQ_map(IRQ_EVT_EDMAINT, 8);//具体的な事件と割り込み番号を関連付ける
        IRQ_reset(IRQ_EVT_EDMAINT);
4.EDMAコントローラの割り込みなどの割り込みソースの起動
これで、サービスルーチンc_を中断するint 8はEDMAINT割り込みサービスであり、他のハードウェア割り込みベクトルの構成は同じである.
5 .DM 642割り込みを記述する実際のフロー定義ベクトルテーブルファイルは、TI社が提供する割り込みベクトルテーブルファイルテンプレートであるves_dm642.asm.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    _vectors       :
_vectors:
_vector0:    VEC_ENTRY    _c_int00
_vector1:    VEC_ENTRY    _vec_dummy
_vector2:    VEC_ENTRY    _vec_dummy
_vector3:    VEC_ENTRY    _vec_dummy
......
_vector15:    VEC_ENTRY    _vec_dummy
  :_vec_dummy    ,VEC_ENTRY      
VEC_ENTRY    .macro    addr
    stw    b0,    *--b15
    mvkl    addr,    b0
    mvkh    addr,    b0
    b    b0
    ldw    *b15++,    b0
    nop    2
    nop
    nop
    .endm
////////////////////////////////////////////////////////////////////////////
     ,VEC_ENTRY  ,        ,B15 B0,             ?
VEC_ENTRY    .macro    addr

STW B0,*--B15  ; B0     *B15,        ,     
MVKL addr,B0
MVKH addr,B0  ;        B0  
B B0  ;     B0     
LDW *B15++,B0   ;      B0  ;   pop 
NOP 2 
NOP 
NOP 
.endm
     ,                  ,            ,            ,        C64X   ,  A0、A1。A2、B0、B1、B2         ,              。

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
割り込みサービスプログラム------>割り込みベクトルテーブル格納初期化(格納アドレス説明)-------->割り込みベクトルテーブルグローバル変数説明------>参照変数説明-------->ツールマクロ作成------->割り込みベクトルテーブル作成(以上の準備に使用)-------->c言語での位置決め割り込みベクトルテーブル-------->割り込み多重レジスタ設定(割り込み番号と割り込みイベントに対応)