TI C64X DSP中断向量表配置(硬件中断)

 TI C64X DSP中断向量表配置(硬件中断)
2007-04-09 11:29

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_int08中断服务例程(假设处理的是EDMA中断)

      .global _vector9         

      .global _vector10

      .global _vector11   

      .global _vector12  

      .global _vector13   

      .global _vector14   

      .global _vector15   

              

        因为引用了rts的_c_int00中断,即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 ;外部中断INT4

_vector5:      VEC_ENTRY _vec_dummy ;外部中断INT5

_vector6:      VEC_ENTRY _vec_dummy ;外部中断INT6

_vector7:      VEC_ENTRY _vec_dummy ;外部中断INT7

_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;Timer0中断

_vector15:     VEC_ENTRY _vec_dummy;Timer1中断

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_int8就可以为EDMAINT中断服务了,其它硬件中断向量的配置同理。

转自 http://hi.baidu.com/yutou410/blog/item/bed743389be7d32297ddd8ed.html,谢谢原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值