2604|1

554

帖子

1236

TA的资源

纯净的硅(中级)

楼主
 

Hercules 的嵌套中断学习理解 [复制链接]

   基本上,Cortex R 内核只提供了IRQFIQ两种默认中断,而且进入IR
的ISR后,CPU会自动屏蔽其他所有IRQ。
也就是说,只要是IRQ, 无论优先顺位,一律不能嵌套,直到当前的IRQ
的ISR执行完成。
    如果用户想实现IRQ的中断嵌套,那么可以在进入ISR之后,手动将
CPSR (current program status register)寄存器的"I" 位清零。
这样后面的更高优先级的IRQ就可以得到响应,并嵌套进来了。
    这个嵌套是没有层级限制的
但是用户需要自行对被打断的ISR现场进行保护,这个工作也会
随着嵌套层级增多而变得复杂,稍有不慎,就可能引起内存溢出。
所以建议大家谨慎使用中断嵌套。

赞赏

1

查看全部赞赏

 
点赞 关注

回复
举报

554

帖子

1236

TA的资源

纯净的硅(中级)

沙发
 
在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  */
}
记得做好保护啥
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表