我想了解ISR(中断服务例程)和函数调用之间的区别。
我觉得从硬件角度来看,函数调用和 ISR 是相同的。如果我错了,请纠正我。
我能找到的有关 ISR 和函数调用的所有信息如下:
ISR:
功能:
当有函数调用时发生
将 PC 和寄存器保存在堆栈上
可以有争论
可以返回值
对执行的大小和持续时间没有限制
除此之外还有什么不同吗?请告诉我。
我还读过有关 ISR 的函数调用是如何发生的。请突出显示它。
因此,在断言它们是相同的之后,您继续列出它们不同的方式 - 这也许可以回答您的问题。
您关于 ISR 的前四点是广泛且普遍正确的。关于启用中断的要点不一定是这种情况,而是程序员的实现决策,并且可能由体系结构决定,并且小是指导方针而不是要求——“小”完全是主观的”。
差异并不在于它们的编码方式(尽管 ISR 通常会施加许多限制,并且还可能具有普通函数没有的特权),而在于它们的调用方式和处理器的行为。
函数(或者更一般的过程或子例程)必须显式调用,并且与其调用者属于同一上下文和执行线程。硬件 ISR 不是显式调用的,而是由某些外部事件调用的(处理器内核外部,即片上外设可能会生成中断)。当调用中断时,在将上下文切换到 ISR 之前,会自动保留当前线程的上下文。返回时,反向上下文切换会恢复中断之前处理器的状态,以便从中断点继续执行。
该机制可能因多线程操作系统或调度程序的存在而变得复杂,其中 ISR 本身可能会导致线程上下文切换,以便在从 ISR 返回时切换到不同的执行线程或上下文。此类机制是受管理的在这种情况下由操作系统。
某些处理器还支持另一种 ISR——软件中断。软件中断的使用类似于函数调用,因为它是由指令而不是单个事件显式调用的,但它提供了一种间接机制,调用者不需要知道 ISR 的地址,而且该地址实际上可能会改变。从这个意义上说,它与通过指针调用函数没有什么不同,但因为它是一个 ISR,所以它在中断上下文中运行,而不是调用者的上下文,因此可能具有普通函数没有的限制和特权。
从根本上讲,中断能够直接且确定地响应事件,否则您可能会轮询或测试事件然后处理它,但只能在您选择测试它时而不是在其实际发生时处理它,这可能是可变且长得令人无法接受。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)