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.

dsp c5517 中断嵌套的问题?

Expert 2137 points


老师:我刚刚试了在串口中断中添加一下语句 :

interrupt void UART_intrDispatch(void) //串口中断
{
     Uint8 temp;
     Uint8 i;

     CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 | 0x0010; //只允许定时器中断
    asm(" NOP"); // Wait one cycle
    asm(" BCLR INTM"); //开全局中断

    IRQ_disable(UART_EVENT); //关闭串口中断

    ......串口处理程序
   IRQ_enable(UART_EVENT); //打开串口中断
}

就是加了     CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 | 0x0010; //只允许定时器中断
    asm(" NOP"); // Wait one cycle
    asm(" BCLR INTM"); //开全局中断

我发现程序很容易死机,是不是我写的有问题?

  • 我整个程序中有4个中断 (1)外部中断0   (2)定时器1中断 (3)uart接收中断 (4) uart_tx_dma  发送完成中断

    我外部中断0 每隔50ms响应一次(外部电平触发),定时器0每隔10ms响应一次自己计时,串口中断不停的接收数据。

    现在我要保证数据进入 串口_isr时,若是定时器响应要能打断串口中断,先执行定时器1中断,等定时器1中断处理完成,再处理未处理完的串口_isr,

    (1)关闭外部中断0,就响应(2)(3)两个中断, 在串口中断中添加以下语句--没有问题。

    CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 | 0x0010; //只允许定时器中断
        asm(" NOP"); // Wait one cycle
        asm(" BCLR INTM"); //开全局中断

    (2)我打开外部中断0,让外部中断0每隔50ms响应一次,还响应(2)(3)(4)中断 在串口中断中添加以下语句-----程序执行一会就会死机。

    CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 | 0x0010; //只允许定时器中断
        asm(" NOP"); // Wait one cycle
        asm(" BCLR INTM"); //开全局中断


    麻烦老师帮我好好的分析下原因。真的比较急切的需要解决这个问题。

  • 我是裸跑的,没有用到操作系统

  • 请问死机具体是什么现象?是完全跑飞了还是还在自己代码中?

  • 完全跑飞了,

    我外部中断是每隔50ms响应一次,    

    再在串口中断中开启定时器1中断嵌套:

    CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 | 0x0010; //只允许定时器中断
    // CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 & 0x0010; //只允许定时器中断
    asm(" NOP"); // Wait one cycle
    asm(" BCLR INTM"); //开全局中断

    程序就很容易跑飞


    若是关闭外部中断,在串口中断开启--定时器1中断嵌套就没有问题

    CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 | 0x0010; //只允许定时器中断
    // CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 & 0x0010; //只允许定时器中断
    asm(" NOP"); // Wait one cycle
    asm(" BCLR INTM"); //开全局中断

  • 老师 我在串口中加这几句开发定时器中断的--有没有问题啊

    CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 | 0x0010; //只允许定时器中断
    // CSL_CPU_REGS->IER0 = CSL_CPU_REGS->IER0 & 0x0010; //只允许定时器中断
    asm(" NOP"); // Wait one cycle
    asm(" BCLR INTM"); //开全局中断



  • IER你在程序初始化的时候就使能了吧?没必要在中断子程序中再打开,在中断子程序中把总中断打开就可以了。

    另外,你代码里的中断比较多,试试加大stack, heap size。

  • 我的cmd文件如附件1

    cmd文件中   .stack    >  DARAM0                /* Primary system stack        */ 这个我设置了

    但是 heap size 这个没有设置  

    C5517.rar
  • 老师 麻烦您帮我看下我这个cmd文件是否有问题  , heap size这个应该如何正确设置?