中断嵌套

linux2.4.0内核中断嵌套处理,可能性分析如下:

1,同一中断线:是否可嵌套,取决于ack是否发屏蔽中断线信号给硬件?
可嵌套中断:
场景:[cpu0 A进程 i ii] [cpu1 B进程] ,先i中断执行后执行ii。若有iii,同理。
两中断(i及ii)被中断控制器分配到同一核cpu0处理,此时使用的堆栈空间均为A的
i ii中断嵌套处理使用边缘触发方式,即i在可中断环境 handle_IRQ_event中处理未返回,ii中断进入do_IRQ流程,发现此时i未完成(简单这样理解),不做handle_IRQ_event处理即刻返回,多嵌套同理。返回i中断处理时,判断当前中断线是否有pending,因该场景pending者ii,为保证所有中断都得到处理机会,会触发再遍历处理一次,ii得以处理。

场景:[cpu0 A进程 i] [cpu1 B进程 ii]
两中断(i及ii)分别被中断控制器分配到cpu0 cpu1中处理 此时各自使用命中进程的堆栈空间,此时无中断嵌套。

不可嵌套中断:
在进入do_IRQ时便ack屏蔽了该中断线,使得同一中断线上中断无法嵌套。
场景:[cpu0 A进程 i ii] [cpu1 B进程]
严格串行化处理
场景:[cpu0 A进程 i] [cpu1 B进程 ii]
处理等同于可嵌套中断的场景:[cpu0 A进程 i] [cpu1 B进程 ii]

2,混合中断线:不同中断线定是可以中断嵌套的
若同线可嵌套:
场景:[cpu0 A进程 i ii iii] [cpu1 B进程],其中:i ii iii同线。
i 先中断 后ii中断嵌套 又i与iii中断嵌套
iii可边缘触发对本端cpu0 ii(未处理直接返回了)的处理。
场景:[cpu0 A进程 i ii iii] [cpu1 B进程 iiii],其中:i ii iiii同线。
i 先中断 后ii中断嵌套 又i与iii中断嵌套
iiii可边缘触发对对端cpu0 ii(未处理直接返回了)的处理。

若同线不可嵌套:
场景:[cpu0 A进程 i ii iii] [cpu1 B进程 iiii],其中:i iii iiii同线
i 先中断 后ii中断嵌套 又ii与iii中断嵌套 iiii最后中断。
iiii可边缘触发对iii(未处理直接返回了)的处理。
无所谓对本端cpu中断的边缘触发

linux2.4.0 vs linux2.6.37(其实2.6以上基本相同了)
1>、后者只允许不同线的嵌套中断,在检测到来自同一中断线的中断时会发送ack屏蔽该中断线,前者若不管是相同中断线还是不同中断线都允许中断嵌套。引出问题:若存在256中断号,则对于后者来说,极端情况也就被中断嵌套255次,而前者会是无限次。
2>、前者中断处理占用命中进程的堆栈空间,后者在中断处理时有堆栈环境的切换动作,有独立的中断栈。问题:中断多时前者会出现堆栈溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32中,中断嵌套是指在处理一个中断时,能够中断当前中断处理程序处理更高优先级的中断。这是通过NVIC(Nested Vectored Interrupt Controller)来实现的。 要实现中断嵌套,首先需要配置每个中断的优先级。优先级较高的中断会在优先级较低的中断之前被处理。可以使用NVIC的相关函数来设置中断的优先级,例如`NVIC_SetPriority()`函数。 当一个中断请求发生时,中断控制器会根据中断的优先级来决定是否中断当前正在执行的中断处理程序。如果新中断的优先级高于当前中断的优先级,那么当前中断会被挂起,处理新中断,然后再返回到原来的中断处理程序。 在处理完高优先级中断后,中断控制器会自动恢复之前被挂起的低优先级中断,并继续执行原来的中断处理程序。 下面是一个示例代码,演示了如何在STM32中实现中断嵌套: ```c // 配置中断优先级 NVIC_SetPriority(USART1_IRQn, 1); // 设置USART1中断的优先级为1 NVIC_SetPriority(USART2_IRQn, 2); // 设置USART2中断的优先级为2 // 中断处理函数 void USART1_IRQHandler(void) { // 处理USART1中断 // 检查是否有更高优先级的中断发生 if (NVIC_GetPendingIRQ(USART2_IRQn)) { // 挂起当前中断,处理USART2中断 NVIC_SetPendingIRQ(USART2_IRQn); } // 继续执行原来的中断处理程序 } void USART2_IRQHandler(void) { // 处理USART2中断 // 继续执行原来的中断处理程序 } ``` 在上面的示例中,当USART1中断发生时,首先会处理USART1中断,然后检查是否有更高优先级的中断USART2发生。如果有,就挂起当前的USART1中断,处理USART2中断,然后再返回到原来的USART1中断处理程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值