我使用了GIOA0的外部中断和CAN总线中断,使用默认优先级,GlOA0为9通道,CAN为16通道,在实际使用GIOA0的中断无法打断CAN的中断,不知何原因?还有实规中断嵌套需要设置哪个寄存器吗?请指导,谢谢!
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.
我使用了GIOA0的外部中断和CAN总线中断,使用默认优先级,GlOA0为9通道,CAN为16通道,在实际使用GIOA0的中断无法打断CAN的中断,不知何原因?还有实规中断嵌套需要设置哪个寄存器吗?请指导,谢谢!
Hi Zhangjie,
关于TMS570的中断嵌套问题,您可以参考这个帖子:
http://e2e.ti.com/support/microcontrollers/hercules/f/312/t/59793.aspx#213613
基本上,Cortex R 内核只提供了IRQ和FIQ两种默认中断,而且进入IRQ的ISR后,CPU会自动屏蔽其他所有IRQ。
也就是说,只要是IRQ, 无论优先顺位,一律不能嵌套,直到当前的IRQ的ISR执行完成。
如果用户想实现IRQ的中断嵌套,那么可以在进入ISR之后,手动将CPSR (current program status register)寄存器的"I" 位清零。
这样后面的更高优先级的IRQ就可以得到响应,并嵌套进来了。
好像这个嵌套是没有层级限制的。
但是用户需要自行对被打断的ISR现场进行保护,这个工作也会随着嵌套层级增多而变得复杂,稍有不慎,就可能引起内存溢出。
所以建议您谨慎使用中断嵌套。
你好,可是我的系统设计中必须GIOA0的这个中断优先级最高,如果我使用FIQ可以吗,其余中断使用IRQ?还有我在其它资料上看到CORTEX-M3核的ARM架构都支持中断嵌套,CORTEX-R的ARM架构是目前还不支持还是本来这个硬件设计就没有考虑中断嵌套?
Hi Zhangjie,
GIOA0作为FIQ应该没有问题的。
但是我不确认FIQ是否能够打断IRQ的操作。(应该可以,但是最好还是测试一下。)
M3支持8级嵌套,R默认不支持,是CPU架构的区别。
您可以查看ARM官方的说明:
infocenter.arm.com/.../index.jsp
个人觉得,Cortex-R实际上是给用户留出了无限嵌套的可能的(只要RAM够大),只不过这个操作需要用户花一些时间和精力自行完成,没有硬件辅助。
从某种意义上来说,这种架构更灵活。
我将GIOA0的中断改为了FIQ中断响应是正确的,CAN中断还是IRQ,可是发现只运行IRQ时是可以的,只运行FIQ可以,如果2个中断都存在,程序运行就出错了,不知道是什么原因
可否提供一个中断嵌套的例子,我在当前中断中打开'I'位,程序运行不正常,请给个嵌套的例子,谢谢!
Hi Zhangjie,
不知道您说的"出错/程序运行不正常"指的是什么样的错误呢?
附件中是一个嵌套的例子。
使用了RTI的比较1和比较2中断,比较1设置为每5ms的FIQ,比较2设置为每8ms的IRQ。
比较2中断ISR中,打开比较1。
ISR中有一个50000次累加的全局变量,这样可以看到什么时候FIQ打断了IRQ,并且您可以看到FIQ的ISR返回后,累加继续进行。
仅供参考。
我说的异常就是当fiq和irq同时有时,程序会跑飞至取址中止的入口,就是两个中断不能同时有.还有一个关于tms570ls20206的can总线中,为什么设置了屏蔽寄存器,可是还是所有的CAN的ID都产生中断,且中断清不掉.关于验收滤波器这方面请赐教!谢谢!
Hi Zhangjie,
您指的是Prefetch Abort吗?
使用前面的例子还有这个问题吗?
如果您使用HALCoGen生成的驱动代码的话,最好不要关闭FPU的支持,貌似关闭后,CPU工作会有点不正常,可能生成的驱动代码有点问题。
关于CAN总线的问题,麻烦您再开个帖子,方便以后的查询,多谢多谢~
我想使用IRQ完成中断嵌套,使用了CAN总线中断和GIOA0的中断,想实现在CAN总线和GIOA0都有中断时,GIoA0的可以打断CAN的中断,GI0A0的优先级高,请给个例子,谢谢