中断的压栈操作、中断内部不可以有延时的动作?

中断与压栈操作

1. 中断时的压栈操作

当一个中断发生时,处理器会自动保存当前的状态(即上下文),以确保中断处理完成后能够恢复到中断发生前的状态。这些状态通常包括程序计数器(PC)、状态寄存器、通用寄存器等。

具体过程:
程序计数器(PC):保存当前执行的指令地址。当中断发生时,处理器会将当前的PC值(即中断发生时正在执行的指令的地址)压入栈中,以便中断处理结束后能够返回到正确的位置继续执行。
状态寄存器(SR):保存当前的中断标志和状态。包括当前是否在中断模式下,是否允许中断等信息。
通用寄存器:如果需要,处理器还会保存一些通用寄存器的值,尤其是在中断服务例程(ISR)可能修改它们时。
这些保存的内容通常被称为中断上下文,它们会被压入到堆栈中。堆栈作为一种先进后出的数据结构,能够确保处理器在中断处理完毕后能够恢复先前的状态。

2. 为什么需要压栈?

压栈的主要目的是为了保存当前执行上下文,确保中断处理完成后能够无误地返回到中断发生之前的执行状态。具体来说,压栈操作有以下目的:

保存中断前的程序状态:防止中断处理过程中修改了程序状态(如PC、寄存器等)导致程序逻辑出错。
中断嵌套:在处理中断时,可能会发生更高优先级的中断。通过压栈,系统可以在处理中断时保存当前状态,以便在完成更高优先级的中断处理后能正确恢复。
保持中断的原子性:通过保存中断前的状态,可以确保中断处理过程中不会被外部干扰,维护中断处理的原子性。

3. 栈的作用

临时存储:栈在处理中断时充当临时存储空间,保存当前的执行上下文。
恢复执行流:中断处理完成后,处理器会从栈中弹出保存的状态信息,恢复原有的执行流,从中断返回到正确的代码位置。

4. 中断的上下文保存与恢复

保存上下文(压栈):当中断发生时,处理器自动保存当前的程序计数器(PC)、状态寄存器(SR)以及其他必要的寄存器值(如通用寄存器)。这个过程通常是由硬件完成的,不需要软件干预。
恢复上下文(弹栈):中断服务例程(ISR)执行完毕后,处理器从栈中弹出之前保存的状态,恢复程序计数器(PC)等寄存器的值,从而返回到中断发生之前的执行状态。

5. 硬件与软件对压栈的支持

硬件支持:大多数现代微控制器(如ARM Cortex-M系列、AVR、STM32等)在发生中断时,都会自动执行压栈操作。这意味着处理器会自动保存必要的寄存器(PC、LR、SR等),以便中断处理结束后恢复。
软件支持:在一些特定情况下,ISR可能会修改一些寄存器或执行复杂操作,需要开发者手动保存和恢复额外的寄存器。对于简单的ISR,中断硬件自动压栈和弹栈通常足够了。

6. 中断服务例程中的栈操作

ISR的开头:在中断发生后,ISR会首先由硬件或编译器自动生成一部分代码,用来保存上下文。大多数情况下,处理器会在进入ISR之前自动完成这些压栈操作。
ISR的结尾:在ISR执行完毕后,通常会通过一条指令恢复之前压入栈中的内容,这些内容包括程序计数器(PC)和状态寄存器等,恢复现场后,程序会返回到中断前的位置继续执行。

8. 总结

是的,中断处理中有压栈操作。当中断发生时,处理器会自动保存当前的执行上下文,包括程序计数器(PC)、状态寄存器、通用寄存器等,确保中断服务例程执行时可以正确恢复。中断重入和嵌套处理依赖于这种压栈和弹栈机制,以便在多个中断处理程序之间能够切换并恢复状态。


中断内部不允许有延时

在中断服务例程(ISR)中,通常不推荐或不允许使用延时操作。原因如下:

1. 阻塞中断处理

中断服务例程的主要目的是响应硬件或软件的事件,并尽快处理这些事件。如果在ISR中使用延时操作(例如循环等待或通过定时器等待),将会导致:

  • 延迟处理其他中断:在ISR中执行延时操作时,控制权被“阻塞”在当前ISR中,导致无法及时响应其他高优先级的中断。对于实时系统来说,这是不可接受的,因为它会导致系统响应变慢,甚至错过一些重要事件。
  • 降低实时性:中断的一个关键要求是能够快速响应外部事件。如果ISR中包含延时,系统的实时性会受到严重影响,可能会导致任务延迟执行或系统不稳定。
2. 嵌套中断的处理

许多微控制器支持中断嵌套,即高优先级的中断可以打断低优先级的中断服务例程。如果在ISR中使用延时,它会延迟ISR的完成,阻止系统响应新的高优先级中断,这违背了中断嵌套和中断优先级的设计原则。

3. 栈溢出风险

每次进入ISR时,处理器会自动将程序计数器(PC)、状态寄存器(SR)、一些寄存器(如R0、R1等)以及堆栈指针(SP)压入栈中。如果ISR中的延时操作很长,它将占用较多的CPU时间和栈空间。如果栈空间有限,长时间的延时可能会导致栈溢出,从而引发系统崩溃。

4. 可能导致死锁或资源争用

在中断中使用延时可能会引起对共享资源的访问冲突。中断服务例程中执行延时时,可能会锁住资源或导致系统中的其他任务无法访问这些资源,进而可能引发死锁或资源争用。

5. 其他系统任务的影响

如果ISR执行期间涉及延时,其他任务或操作系统中的定时器、中断等将无法及时得到执行,进而导致系统的其他功能无法正常工作。这是嵌入式系统中常见的时间敏感问题。

6. 中断延时的负面影响

在某些嵌入式系统中,ISR会与操作系统的调度机制协作,或与其他定时任务和实时任务交互。如果ISR中有延时,它会影响整个系统的调度,导致任务不按预期执行,降低系统的实时性能。


7. 解决方案:避免在ISR中使用延时
  • 使用定时器中断:如果必须延时,可以考虑使用定时器中断来代替ISR中的延时。例如,设置一个定时器来在预定时间后触发中断,在另一个ISR中处理延时后的任务,而不是在原来的ISR中等待。
  • 使用旗标/标志:在ISR中,不应直接执行延时,而是可以通过设置标志位来通知主循环或其他任务进行延时操作。例如,ISR可以设置一个标志,主程序可以轮询该标志并在适当的时候执行延时。
  • 优化ISR时间:保证ISR尽可能短小,只处理最关键的操作,并尽量将耗时操作推迟到主程序或更高优先级的任务中进行处理。

8. 总结

中断服务例程(ISR)不应包含延时操作,主要原因包括:

  • 阻塞中断处理和降低系统响应速度。
  • 影响中断嵌套和中断优先级管理。
  • 增加栈溢出和资源争用的风险。
  • 干扰其他系统任务和操作系统调度。

为了保持系统的实时性和稳定性,延时操作应避免直接在ISR中执行,而是通过其他机制(如定时器中断、旗标等)来处理。

posted @   WJnuHhail  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示