[资料分享] 说下DM6437 中断向量表配置问题

Jacktang   2017-2-27 17:33 楼主
DM6437  中断向量表配置
1. 编写中断服务例程
在.c源文件中编写ISR函数c_intXX,用于中断处理,如:
interrupt void c_intXX (void)
{
         …;
}
注:对于硬件中断而言,XX = 00~15。
2.初始化中断向量表,并在内存段中的中断向量表中配置好对应的中断向量
         首先是把中断向量表定位到某一内存段中,我们可以在cmd文件中配置中断向量表的内存映射,如:
MEMORY
{
   VECS:       o = 0x10800000 l = 0x00000400
   MEMTEST:    o = 0x10800400 l = 0x00000200
   IRAM:       o = 0x10800600 l = 0x0001FA00
   DDR2:       o = 0x80000000 l = 0x10000000
}
SECTIONS
{
   .bss       >   IRAM
   .cinit      >   IRAM
   .cio       >   IRAM
   .const      >   IRAM
   .data       >   IRAM
   .far       >   IRAM
   .stack      >   IRAM
   .switch    >   IRAM
   .sysmem    >   IRAM
   .text       >   IRAM
   .vecs       >   VECS
   .ddr2       >   DDR2
}
     
         然后建立一个.asm文件,用以配置中断向量表中的中断向量,我们需要声明一些全局变量,以便其他源文件可以引用这些变量或者引用其他源文件的变量,如:
  *-----------------------------------------------------------------* Global symbols defined here and exported out of this file
*--------------------------------------------------------------------   .global _vectors
  .global _c_int00
  .global _vector1                  
  .global _vector2       ;RSVD保留
  .global _vector3       ;RSVD保留
  .global _vector4
  .global _vector5
  .global _vector6
  .global _vector7
  .global _vector8
  .global _vector9   
  .global _vector10
  .global _vector11   
  .global _vector12   
  .global _vector13   
  .global _c_int14_vencint ; Hookup the c_int14 ISR in main()
  .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.启动中断源,如venc中断
至此,中断服务例程c_int14_vencint 就可以为venc中断服务了,其它硬件中断向量的配置同理。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复