TI论坛
直播中

蒋美燕

7年用户 901经验值
私信 关注
[问答]

请教关于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中断服务程序去.该怎么办?

回帖(10)

王山崎

2018-7-25 09:44:36
在定时器中断里打开全局中断开关试试
举报

李波

2018-7-25 09:54:41
#1. #2.不矛盾,一个是讲的中断控制器不支持硬件嵌套。一个讲的是软件如何实现嵌套。
你的问题是需要用软件实现嵌套来解决。方法两种:
#1. 用BIOS的中断dispatcher,很方便实现嵌套(说白了就中BIOS的软件实现中断嵌套的配置接口)
#2. 在没有用BIOS的情况下,自己根据上面第2条里的方法在timer中断里保存IRP,打开全局中断,以允许GPIO中断进来。说白了就是把中断响应时硬件自动实现的动作用软件保存起来,所以仔细看一下芯片在响应中断时硬件自动做了哪些动作,把这个理解了自然就没有疑问了。
举个例子,在响应中断时,硬件自动把当前PC值保存到IRP,你可以看一下ISR编译产生的汇编最后一条语句是 B IRP。想像一下,如果在ISR里嵌套别的中断进来,CPU也会把返回地址自动保到IRP寄存器,哪前面那个中断的返回地址(在IRP里)就被覆盖了,还能一级级返回吗,所以上面一个保存IRP各恢复IRP的操作。
其它同理~~~
                                                                         http://processors.wiki.ti.com/index.php/Main_Page
Think Over Before Asking.
http://www.catb.org/~esr/faqs/smart-questions.html#goal
举报

蒋美燕

2018-7-25 10:13:05
引用: lifei639156 发表于 2018-7-25 09:54
#1. #2.不矛盾,一个是讲的中断控制器不支持硬件嵌套。一个讲的是软件如何实现嵌套。
你的问题是需要用软件实现嵌套来解决。方法两种:
#1. 用BIOS的中断dispatcher,很方便实现嵌套(说白了就中BIOS的软件实现中断嵌套的配置接口)

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中断服务程序中。
举报

李波

2018-7-25 10:26:37
引用: bctwerwer 发表于 2018-7-25 10:13
Tony Tang: 谢谢你的来信。

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

                                                                         http://processors.wiki.ti.com/index.php/Main_Page
Think Over Before Asking.
http://www.catb.org/~esr/faqs/smart-questions.html#goal
举报

更多回帖

发帖
×
20
完善资料,
赚取积分