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