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.

C64x+, 中断嵌套,资料有些冲突

代码情况:一个10us定时器中断,定时器中断中运行时间大约为7us时间。

                   一个GPIO中断,做正弦波相位校准。当该中断触发,需立马执行该服务程序。

想设计效果:定时器中断服务子程序,可以被GPIO中断服务程序嵌套。我已经将GPIO中断优先级高于定时器中断。

参考了很多资料,感觉有疑惑:

     1.在TMS320C64x+ DSP Megamodule Reference Guide中有一句“”“Since any interrupt service routine can be atomic (not nestable), the CPU interrupt priority only applies to pending interrupts”,说可屏蔽中断,不可以被嵌套。

     2.在“”TMS320C64x/C64x+ DSPCPU and Instruction Set”中,又有一篇专门讲Nested Interrupts,我按资料写了中断嵌套代码,保护IRP,CSR,........在恢复CSR,..;

          old_irp = IRP;
         old_csr = CSR ; 
         CSR = old_csr | 1 ;
         /* Interrupt service code goes here.
         /* Interrupts may occur while this code executes       //测试发现: 当GPIO中断触发后,并没有立马跳到GPIO中断服务子程序
         CSR = CSR & -2 ; 
         CSR = old_csr ; 
         IRP = old_irp ; 

      问题:我把GPIO中断优先级设最高。当DSP的PC跳到定时器服务程序中,我触发GPIO中断,但是程序为马上跳到GPIO中断,而是运行完定时器中断后,才执行GPIO中断。  如果我要程序在执行定时器中断服务程序时,若GPIO中断触发能立马嵌套,跳到GPIO中断服务程序去.该怎么办?

  • 在定时器中断里打开全局中断开关试试

  • #1. #2.不矛盾,一个是讲的中断控制器不支持硬件嵌套。一个讲的是软件如何实现嵌套。

    你的问题是需要用软件实现嵌套来解决。方法两种:

    #1. 用BIOS的中断dispatcher,很方便实现嵌套(说白了就中BIOS的软件实现中断嵌套的配置接口)

    #2. 在没有用BIOS的情况下,自己根据上面第2条里的方法在timer中断里保存IRP,打开全局中断,以允许GPIO中断进来。说白了就是把中断响应时硬件自动实现的动作用软件保存起来,所以仔细看一下芯片在响应中断时硬件自动做了哪些动作,把这个理解了自然就没有疑问了。

    举个例子,在响应中断时,硬件自动把当前PC值保存到IRP,你可以看一下ISR编译产生的汇编最后一条语句是 B IRP。想像一下,如果在ISR里嵌套别的中断进来,CPU也会把返回地址自动保到IRP寄存器,哪前面那个中断的返回地址(在IRP里)就被覆盖了,还能一级级返回吗,所以上面一个保存IRP各恢复IRP的操作。

    其它同理~~~

  • Tony Tang: 谢谢你的来信。


    在定时器中断服务程序中,我做的效果和你说的一样,我保存了IRP,CSR,并开启了全局中断。代码如下:

             old_irp = IRP;
             old_csr = CSR ;
             CSR = old_csr | 1 ;

               之后任意时刻发生GPIO中断,但是定时器中断服务程序还没执行完成,这时GPIO中断来到,IFR中对应的IF4置1(GPIO中断到来),程序并没有立即跳出定时器中断服务程序。 如果手动B 跳转到GPIO中断入口或许可以实现嵌套跳转,但是定时器中断服务程序很大,我不能在每个语句下面读IFR来判断GPIO中断有没到来(IF4是否为1)??????

      补充说明:GPIO中断优先级为4可屏蔽中断中最高,定时器中断优先级为6。     我没用BIOS,就是裸程序,想在很长的定时器中断服务程序中,能快速判断GPIO中断到来并能实时跳到GPIO中断服务程序中。



  • 文档spru732j上有现成的示例代码。你是怎么判断没有跳到GPIO中断去的?GPIO中断在IER里有没有使能。

  • Tony Tang:

                   我是之前,就是参考你说的这个例子写到的程序。

                   你问我IER中GPIO中断开启了没,我可以确切告诉你GPIO中断使能是开启的(IER的IE4为1),我并把GPIO中断设置成非屏蔽中的最高优先级。

                   你可能没有留意, 我说的测试过程。我重述一下我的测试过程呢(就用你发的example5-17图片实例说明):

                这个实例为我的定时器中断服务器程序,当定时器触发中断到,DSP立马运行到定时器中断服务程序中的"interrupt service code goes here",在这个代码里,手动触发产生一个GPIO中断,发现IFR的IF4为1(说明GPIO中断以后发生),但是程序并没跳到GPIO中断服务程序,只有当DSP运行完定时中断服务程序后,并运行完IRP=old_irp;后,DSP才跳到GPIO中断服务程序。。(备注需要的效果是:"interrupt service code goes here"里的程序很大,GPIO中断随机时刻到来时,能立即中断定时器中断嵌套到GPIO中断服务程序)

                测试结果:

                   只有当定时器中断运行完后(优先级为6),才执行GPIO中断服务程序(优先级为4)。在定时中断服务程序中,我以前就是像你发的图片那样保存和恢复相应的寄存器的, 为什么不能在定时中断服务程序中,嵌套到GPIO中断?(补充:GPIO中断,定时器中断都能正常触发,就是没有嵌套能力)

  • 好吧,看来我不得不自己动手做一个了~~~

  • 基于C6748 starterware 的timer的例子,稍做修改增加一个timer 3中断,与timer 2嵌套。

    以打印结果为证,完全没问题。

  •              我那个代码和你的是一样的,今天又找了半天的原因:发现代码没有问题,问题出在我单步调试,DSP始终不嵌套运行;如果按F5全速运行,就可以嵌套运行了......

           很奇特的调试!

  • 感谢你的回答!

  • dong wei1 说:
    问题出在我单步调试,DSP始终不嵌套运行;如果按F5全速运行,就可以嵌套运行了......

    看是不是自己被自己嵌套了,没有在IER里把自己的中断使能关掉。

  • IER中我看了的,单步运行都是开启中断的。自己被自己嵌套,应该不会我是单步运行的。

    难的去研究了,再开启CSR前打断点,F5全速运行就可以嵌套到另一个中断服务,在返回该中断服务;如果单步运行就不的行。反正很奇特!