This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

中断向量表如何编写?



1、有没有关于中断的例程

2、中断向量表如何编写,是不是只能用汇编编写。

3、全局符号是什么概念啊,是指全局变量吗,还是其他什么,函数名称是全局符号吗。

  • 1. 请问用的是哪款器件?

    2. 用汇编写。

    3. 您指的全局符号是用.global定义吗? 在汇编手册第104页上有说明。
    http://www.ti.com/lit/ug/spru186w/spru186w.pdf

     

  • 1、我用的6747。

    2、具体如何编写啊,有没有什么规范,感觉无从下手啊。

    3、函数名是(global)symbol吗

    4、在map文件中global symbol是什么啊。

    5、在汇编编写的中断向量表中用global定义的符号和map文件中的global symbol是一回事吗。

    6、中断服务函数的名称是不是必须在中断向量表中用global定义才能将中断服务程序的地址赋给中断向量表中。

    7、同一个工程中是不是只能同时又12个中断服务程序,如果中断超过12个还可以实现吗。

    8、同一个工程是不是可以编写多个中断向量表,并且把他们置于不同位置,通过修改ISTP中ISTB的值就可以实现超过12个中断服务层序的实现。

  • 2. 见附件中断向量表的写法。

    3. 函数名可以用global定义。

    4. 全局符号,你可以对应程序看。

    5. 一样的。
     
    6. 中断向量表中用global定义,是为了其他代码文件里调用它。

    7.  c6747有interrupt controller,可以把不同的事件映射到这12个中断。可以看一下下面的文档第7章节。
    http://www.ti.com/lit/ug/sprufk5a/sprufk5a.pdf

    8. 一个工程一个中断向量表。 

  • 1、中断向量表中定义的global symbol 为什么前面都加下划线。这样和中断服务程序名称不就对应不上了吗。

    2、有没有关于c674x的中断例程啊,最好有关于关于中断数超过12个的处理例程。

  • 1. 这个是compiler编译器规定的。如果从c语言里调用汇编函数的话,汇编函数前需要加下划线,看一下编译器文档第201页上的例程。
    http://www.ti.com/lit/ug/spru187u/spru187u.pdf


    2. 超过12个的处理例程没有。我们只有简单的一个中断的例程。可以看一下cslr中的例程。

     http://processors.wiki.ti.com/index.php/QuickStartOMAPL1x_rCSL

  • 1、我怎么感觉像是汇编在调用C语言函数啊,不像是C调用汇编啊,因为中断服务程序是在C文件中定义的。

    2、例程中好多子函数定义找不到啊,比如_enable_interrupts(),CSL_FINST(),这些都在哪。

    3、还有6748starterware中也有好多子函数找不到,比如ASSERT();HWREG()。

  • 1. 不管是C调用汇编还是汇编调用c, 汇编文件里的函数名或变量需要在前面加下划线。

    2.  _enable_interrupts是rts库里的内嵌函数。看编译器手册7.5.6 Using Intrinsics for Interrupt Control and Atomic Sections。
    http://www.ti.com/lit/ug/spru187q/spru187q.pdf 

     CSL_FINST这个在quickStartOMAPL1x_rCSL\OMAPL1x\support\includes\ti\pspiom\cslr\cslr.h头文件里有定义。

  • 1、内嵌函数应该要声明吧。可是没看见啊。

    2、另外_enable_interrupts()是对什么进行操作呢。rts库在什么地方。可以看到_enable_interrupts()的源代码吗。

  • 问下,中断向量表怎么刚好是对应的中断处理函数例如:

    _intcVectorTable:
    _vector0: VEC_ENTRY _c_int00 ;RESET
    _vector1: VEC_ENTRY _vec_dummy ;NMI
    _vector2: VEC_ENTRY _vec_dummy ;RSVD
    _vector3: VEC_ENTRY _vec_dummy ;RSVD
    _vector4: VEC_ENTRY _EDMA3CC_INT1_isr ;DSP Maskable INT4 : Mapped to func 'EDMA3CC_INT1_isr'
    _vector5: VEC_ENTRY _Timer0_12_isr ;DSP Maskable INT5 : Mapped to func 'Timer0_12_isr'
    _vector6: VEC_ENTRY _vec_dummy ;DSP Maskable INT6 : Empty
    _vector7: VEC_ENTRY _vec_dummy ;DSP Maskable INT7 : Empty
    _vector8: VEC_ENTRY _vec_dummy ;DSP Maskable INT8 : Empty
    _vector9: VEC_ENTRY _vec_dummy ;DSP Maskable INT9 : Empty
    _vector10: VEC_ENTRY _vec_dummy ;DSP Maskable INT10: Empty
    _vector11: VEC_ENTRY _vec_dummy ;DSP Maskable INT11: Empty
    _vector12: VEC_ENTRY _vec_dummy ;DSP Maskable INT12: Empty
    _vector13: VEC_ENTRY _vec_dummy ;DSP Maskable INT13: Empty
    _vector14: VEC_ENTRY _vec_dummy ;DSP Maskable INT14: Empty
    _vector15: VEC_ENTRY _vec_dummy ;DSP Maskable INT15: Empty

    为什么  _EDMA3CC_INT1_isr和_Timer0_12_isr 刚好放在_vector4和_vector5那一行呢,这个从那里得处理的?

  • 初始化里将这两个中断事件映射到了4和5号中断了,所以就要将对应的ISR地址放在这个表里。

  • 明白了,  

    dspintcRegs->INTMUX1 =
    CSL_FMK(DSPINTC_INTMUX1_INTSEL4,CSL_INTC_EVENTID_GPIO_BNK0_INT) |
    CSL_FMK(DSPINTC_INTMUX1_INTSEL4,CSL_INTC_EVENTID_EDMA3CC_INT1);   通个这个就可以选择不同的向量号,难怪找了半天没找对对应关系,以为是光使能了INTMUX1是控制事件号与中断表4~7的位置。

    终于搞清楚了