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.

C6655的uPP_Isr中断函数内设置断点,无法回到主程序?



我在调试C6655的uPP_Isr时候遇到了这个问题,一旦在uPP_Isr中断函数内设置断点进行调试,最终中断函数都会运行到

#ifdef __TI_EABI__
interrupt void _c66x_mask_int8_isr (void)
#else
interrupt void c66x_mask_int8_isr (void)
#endif
{
    c66xISRtbl[8]();
}

这个地方停止,无法回到主程序。

而且检查发现c66xISRtbl[8]确实是指向uPP_Isr,请问该如何解决?

  • 这个是哪里的程序?是单步执行的时候停止还是全速运行的时候?有没有报错?
  • c66xISRtbl[8]();这个函数能执行通过吗?
  • Tronlong开发板的例程,如果不在uPP_Isr中断函数内设置断点,主程序通信完全没问题,但是一旦在中断函数内设置断点,就无法回到主程序内,全速运行发现程序会跑飞,单步执行还发现会在
    {
    c66xISRtbl[8]();
    }


    这个部分执行完后跑飞。

  • 图片看不到,重新附件上传一下。
    不打断点能跑那说明程序逻辑上没问题,只能建议多设一些断点,看跳到哪一步可以执行。
  • 跑飞的问题找到了,因为我在主程序内使用了一个循环

    while(upp_interrupt_count < 402)
    {
    
    }

    来判断一次完整传输是否完成(正常一次传输完成后,upp_interrupt_count = 402),但是程序一旦进入到中断函数后,就无法再次进入中断,导致upp_interrupt_count技术不再增加,这个循环变成死循环。

    当把这个循环换成一个delay后,程序可以正常传输完成。

                Delay(0xfffff);
    //            while(upp_interrupt_count < 402)
    //            {
    //
    //            }

    中断函数为:

    /****************************************************************************/
    /*                                                                          */
    /*              中断服务函数                                                */
    /*                                                                          */
    /****************************************************************************/
    void uPP_Isr(void)
    {
        //	unsigned int intr_dmai_status, intr_dmaq_status;
        unsigned int intr_dmai_status, intr_dmaq_status;
    
        intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
        intr_dmaq_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHQ);
    
        while (intr_dmai_status != 0 || intr_dmaq_status != 0)
        {
            if (intr_dmai_status & uPP_INT_EOL)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOL);
                upp_interrupt_count++;
            }
    
            if (intr_dmai_status & uPP_INT_EOW)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);
                upp_interrupt_count++;
            }
    
            if (intr_dmai_status & uPP_INT_ERR)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_ERR);
                upp_error_count++;
            }
    
            if (intr_dmai_status & uPP_INT_UOR)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_UOR);
                upp_error_count++;
            }
    
            if (intr_dmai_status & uPP_INT_DPE)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_DPE);
                upp_error_count++;
            }
    
            if (intr_dmaq_status & uPP_INT_EOL)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_EOL);
                upp_interrupt_count++;
            }
    
            if (intr_dmaq_status & uPP_INT_EOW)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_EOW);
                upp_interrupt_count++;
            }
    
            if (intr_dmaq_status & uPP_INT_ERR)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_ERR);
                upp_error_count++;
            }
    
            if (intr_dmaq_status & uPP_INT_UOR)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_UOR);
                upp_error_count++;
            }
    
            if (intr_dmaq_status & uPP_INT_DPE)
            {
                uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_DPE);
                upp_error_count++;
            }
    
            intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
            intr_dmaq_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHQ);
        }
    
        uPPEndOfInt(SOC_UPP_0_REGS);
        CICClearSystemEvent(SOC_CIC_0_REGS, INTC0_uPPINT);
    }

    您有时间请帮我看一下,为什么进入一次中断函数中断后,就无法再次进入中断函数。

    谢谢!!!