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.

关于中断的问题



定时器中断,安排在 INT12位置,在中断入口处安排一下代码,工作正常。

但是,问题是来了, 进入中断之前的 B0,必然消失,那么 该 如何保护 呢?

中断程序中保护了,但是在此处已经被破坏!

INT12:
        MVKL  _timer0_isr__Fv , B0 ; load destination function address to b0
        MVKH _timer0_isr__Fv, B0

        B B0
        NOP 3 ; fill delay slot
        NOP
        NOP
        NOP
        NOP


  • ; 如果 ISR 程序在 1M范围内,可以直接用 B lable
    ; 如果 ISR 程序超出 1M范围内,用 Branch Using a Register,就要保存此 Register

    ; 中断入口处只有8个字节的指令(最多14),不够保存必要的寄存器

    找到了 笨办法:采用跳转办法

    1、ISR 采用C编程:interrupt void timer0_isr(void);

    2、中断向量处:

    INT12:


    STW .D2T2 B3,*B15--[2]      ;保存 B3 ,SP-=8;

    MVKL _INT12_JUMPER__Fv,B3 ; load destination function address to b3
    MVKH _INT12_JUMPER__Fv,B3
    B B3
    NOP 5 ; fill delay slot
    NOP
    NOP
    NOP

    3、跳转处 _INT12_JUMPER__Fv

    ;进来之前
    ;SP = SP -8,B3 已经保存
    _INT12_JUMPER__Fv:

    MVC .S2 IRP,B3
    STW .D2T2 B3,*+SP[1]   ;保存 IRP

    MVKL $C$L1,B3  
    MVKH $C$L1,B3
    MVC .S2 B3,IRP              ;在IRP中装载 返回地址(返回到本跳转程序),便于跳转程序接管

    MVKL _timer0_isr__Fv,B3  ; 
    MVKH _timer0_isr__Fv,B3
    B B3                                             ;转到 真的 ISR 
    NOP 5 ; fill delay slot

    $C$L1:
    LDW .D2T2 *+SP[1],B3                  ;IRP 装载到 B3
    NOP 4
    MVC .S2 B3,IRP                             ;IRP也恢复,确保万无一失,虽然似乎不用

    B B3                                                ;跳转到 应用程序中断发生的地方继续执行
    LDW .D2T2 *+SP[2],B3                  ;恢复B3
    || ADD .L2 8,SP,SP                         ;恢复SP
    NOP 4

    经过 simulator 测试验证,工作机制正常,没有问题。

  • C ISR的关键字interrupt编译后的函数应该是会保护这些寄存器的,你可以看一下编译产生的汇编文件。

  • 细看了一下,上面的写法是你自己写的吧,不是标准写法。在前面加上 STW   B0,*--B15保护一下B0就好了。

    下面的示例供你参考:

    ; Global symbols defined here
    .global IntcVectorTable
    .global _c_int00
    .global Timer3_12_ISR
    .global SupperIntNmi
    .global DspIntCi2ISR
    .global DspIntCi3ISR
    .global fix_start
    ;******************************************************************************
    ;* VEC_ENTRY: 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

    ;******************************************************************************
    ;* vec_dummy: Dummy interrupt service routine used to initialize the IST.
    ;******************************************************************************
    _vec_dummy:
    B IRP
    NOP 5
    ;******************************************************************************
    ;* vec_dummy: Dummy interrupt service routine used to initialize the IST.
    ;******************************************************************************
    _vec_dummy_nmi:
    B NRP
    NOP 5
    ;***************************************************************************************
    ;* Map interrupt service table (IST) to corresponding interrupt service routines (ISR)
    ;***************************************************************************************
    .sect ".vecs"
    .align 1024

    IntcVectorTable:

    _vector0: VEC_ENTRY _c_int00 ;RESET
    _vector1: VEC_ENTRY SupperIntNmi ;NMI
    _vector2: VEC_ENTRY _vec_dummy ;RSVD
    _vector3: VEC_ENTRY _vec_dummy ;RSVD
    _vector4: VEC_ENTRY DspIntCi2ISR ;DSP Maskable INT4 : EMPTY
    _vector5: VEC_ENTRY _vec_dummy ;DSP Maskable INT5 : Empty
    _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

  • 是的。保护B0就可以了!

    我自己在跳转程序里也是这个思路,不过既然这样可以,就不需要跳转了,简单的事情想复杂了。谢谢!