TI中文支持网
TI专业的中文技术问题搜集分享网站

tms570ls20206中断嵌套问题

我使用can总线高中断和GIOA0的高中断,设置GIOA0的优先级高于CAN总线的,目前想实现中断嵌套,我是在程序中入CAN的中断后将can的中断 VIM使能关闭,打开CPSR的I位,出中断再关闭cpsr的I位,在入gioa0的中断后将gioa0的中断vim使能关闭,这样做我没有实现中断嵌套,造成了CAN总线运行一段时间后中断无法清楚,请指教!如果有关于中断嵌套的例子请发一个,谢谢!中断都是用IRQ中断。

Renton:

Hi Zhangjie,

   抱歉回复晚了。

   我目前没有类似的例子。

   可能需要编写一个了,需要花点时间,抱歉。

zhangjie zhangjie:

回复 Renton:

你能告诉我中断嵌套的方法吗?我写的老是会跑飞到取址中止的入口,谢谢!

Luffy Li:

回复 zhangjie zhangjie:

在IRQ处理函数起始处通过如下所示汇编代码进行现场保护,处理完毕后再进行恢复。

同时在保护好现场后需要将优先级等于或小于本身的IRQ中断禁掉,恢复现场后再将相应中断打开。中断关闭打开操作可以通过VIM进行。这样就可以实现高优先IRQ的

嵌套处理。

#pragma INTERRUPT(rtiCompare0Interrupt, IRQ)

void rtiCompare0Interrupt(void)

{

/* USER CODE BEGIN (39) */

/* USER CODE END */

   rtiREG1->INTFLAG = 1U;

   asm("   STMFD SP!, {R0-R12, LR}");/*Save R0- R12, LR_irq*/  

   asm("   mrs lr, spsr"); /* Copy SPSR_irq to LR */

   asm("   STMFD SP!, {LR}"); /* Save SPSR_irq */

   asm("   MSR CPSR_c, #0x1F"); /* Enable IRQ (Sys Mode) */

   asm("   STMFD SP!, {LR}"); /* Save LR */

   rtiDisableNotification(rtiNOTIFICATION_COMPARE0);/*Disable rtiCompare1 Interrupt iteself */

   rtiNotification(rtiNOTIFICATION_COMPARE0);

   //asm(" LDMFD SP!, {R0-R12}");/*Restore R0-R12*/

     asm(" LDMFD SP!, {LR}"); /* Restore LR */

     asm(" MSR CPSR_c, #0x92"); /* Disable IRQ (IRQ Mode) */

     asm(" LDMFD SP!, {LR}"); /* Restore SPSR_irq to LR */

     asm(" MSR SPSR_cxsf, LR"); /* Copy LR to SPSR_irq */

     asm("   LDMFD SP!, {R0-R12, LR}");/* Restore LR */

     rtiEnableNotification(rtiNOTIFICATION_COMPARE0);/*Enable rtiCompare1 Interrupt  */

 

附件是RTI嵌套中断的例程,你参考一下。

赞(0)
未经允许不得转载:TI中文支持网 » tms570ls20206中断嵌套问题
分享到: 更多 (0)