1436|0

6587

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

TMS320C6000基础学习Bootloader与VectorTable [复制链接]

中断服务程序(ISR)
        当使用-c或-cr链接器选项时,DSP的C编译器自动的创建了函数_c_int00,这个函数对应C程序的入口地址,复位向量必须跳转到_c_int00地址处。当C程序遇到一个CPU中断时,在中断向量表中或中断服务程序中要使用的CPU寄存器都将先被压入堆栈,一旦中断服务程序完成,堆栈中的值弹出到对应的寄存器,继续执行原C程序。
        中断服务程序需要使用关键字interrupt声明,
[cpp] view plain copy print?
interrupt void myISR(void)  
{  
    /* Code for myISR */  
    …  
}  

中断服务程序没有返回值,也没有参数,interrupt的功能就是在执行该中断服务程序前自动将寄存器压栈,执行完后自动的弹栈。

[cpp] view plain copy print?
*********************************************************************************  
* vecs.asm  
* Copyright 2003 by SEED Electronic Technology Ltd.  
* All rights reserved. Property of SEED Electronic Technology Ltd.                          *  
* Designed by:  Hongshuai.Li                                                                *  
*********************************************************************************  

*------------------------------------------------------------------------------  
* Global symbols defined here and exported out of this file  
*------------------------------------------------------------------------------  
   .global _vectors  
   .global _c_int00  
   .global _vector1  
   .global _vector2  
   .global _vector3  
   .global _vector4  
   .global _vector5  
   .global _vector6  
   .global _vector7  
   .global _c_int08  ; Hookup the c_int08 ISR in main()  
   .global _vector9     
   .global _vector10   
   .global _vector11     
   .global _vector12   
   .global _vector13     
   .global _vector14     
   .global _vector15     

*------------------------------------------------------------------------------  
* Global symbols referenced in this file but defined somewhere else.   
* Remember that your interrupt service routines need to be referenced here.  
*------------------------------------------------------------------------------  
   .ref _c_int00  

*------------------------------------------------------------------------------  
* This is a macro that instantiates one entry in the interrupt service table.  
*------------------------------------------------------------------------------  
VEC_ENTRY .macro addr  
    STW   B0,*--B15  
    MVKL  addr,B0  
    MVKH  addr,B0  
    B     B0  
    LDW   *B15++,B0  
    NOP   2  
    NOP     
    NOP     
   .endm  


*------------------------------------------------------------------------------  
* This is a dummy interrupt service routine used to initialize the IST.  
*------------------------------------------------------------------------------  
_vec_dummy:  
  B    B3  
  NOP  5  

*------------------------------------------------------------------------------  
* This is the actual interrupt service table (IST). It is properly aligned and  
* is located in the subsection .text:vecs. This means if you don't explicitly  
* specify this section in your linker command file, it will default and link  
* into the .text section. Remember to set the ISTP register to point to this  
* table.  
*------------------------------------------------------------------------------  
.sect ".text:vecs"  
.align 1024  

_vectors:  
_vector0:   VEC_ENTRY _c_int00    ;RESET  
_vector1:   VEC_ENTRY _vec_dummy  ;NMI  
_vector2:   VEC_ENTRY _vec_dummy  ;RSVD  
_vector3:   VEC_ENTRY _vec_dummy  
_vector4:   VEC_ENTRY _vec_dummy  
_vector5:   VEC_ENTRY _vec_dummy  
_vector6:   VEC_ENTRY _vec_dummy  
_vector7:   VEC_ENTRY _vec_dummy  
_vector8:   VEC_ENTRY _c_int08    ; Hookup the c_int08 ISR in main()   
_vector9:   VEC_ENTRY _vec_dummy  
_vector10:  VEC_ENTRY _vec_dummy  
_vector11:  VEC_ENTRY _vec_dummy  
_vector12:  VEC_ENTRY _vec_dummy  
_vector13:  VEC_ENTRY _vec_dummy  
_vector14:  VEC_ENTRY _vec_dummy  
_vector15:  VEC_ENTRY _vec_dummy  

*------------------------------------------------------------------------------  


********************************************************************************  
* End of vecs.asm  
********************************************************************************  
上面是一个实际使用的C6713的中断向量表的汇编文件(vecs.asm),其中定义了全部15个中断向量,复位向量跳转到_c_int00地址,8号中断向量跳转到_c_int08函数地址,在C主程序中应该做如下定义,
[cpp] view plain copy print?
/*
* interrupt function
*/  
interrupt void c_int08(void)  
{  

}  
另外,由于在C程序中的PC跳转到中断向量地址是远跳转,因此有时需要在C程序中声明中断向量地址为远地址,如下,
[cpp] view plain copy print?
extern far void vectors();  
其中的vectors()表示中断向量表的起始地址(汇编中使用了_vectors)。
注意:C中的变量和函数对应到汇编中都多了一个下划线(_),编译器在将C编译成汇编时都会自动添加下划线。

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表