首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISR和函数调用的区别?

ISR和函数调用的区别?
EN

Stack Overflow用户
提问于 2013-07-21 00:35:31
回答 4查看 19.9K关注 0票数 8

我想了解ISR (中断服务例程)和函数调用之间的区别。

从硬件的角度来看,我觉得函数调用和ISR都是一样的。如果我错了,请纠正我。我所能找到的关于ISR和函数调用的内容如下:

ISR:

  • 程序执行过程中随时可能发生的异步事件。
  • 将PC、标志和寄存器保存在堆栈上,禁用所有中断并加载ISR地址。
  • ISR不能有可以传递给它的参数。
  • 不能返回值
  • 启用中断
  • 通常是很小的,因为它们占用了其他过程的时间。
  • 有些ISR有自己的堆栈

函数:

  • 在有函数调用时发生。
  • 保存PC并在堆栈上注册。
  • 可能有争论
  • 可以返回值
  • 对执行的规模和持续时间没有限制

除了这个,还有什么区别吗?请让我知道。我还读到过ISR的函数调用是如何发生的。请在上面突出显示。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-21 01:24:04

它们不一定与您在ISRs上的第一点所述相同:中断是异步的,因此必须以某种方式“中断”主处理器的工作。

例如,让我们看看这个用地址修饰的MIPS代码,它没有任何有用的东西:

代码语言:javascript
复制
4000.       add $1, $2, $3
4004.       sw $ra, 0($sp)
4008.       jal subr   # function call, sets $ra to 4012 and jumps to 4024
4012.       lw $ra, 0($sp)
4016.       jr $ra
4020.
4024. subr: sub $2, $1, $3
4028.       jr $ra

这段代码可以从主处理器处理:算术操作(第1、7行)由算术单元完成,内存访问(第2、4行)由内存控制器完成,跳转(第3、5、8行)也由主cpu完成。( jal的实际地址是在对象文件绑定期间设置的。)

这是用于函数调用的。在任何时候,它都被确定,代码现在在哪里,哪些代码在下一个时间点被执行(即当程序计数器被递增: PC+=4)。

现在问题来了,当你的函数做一些复杂的事情时,你仍然希望软件在关键的一笔上做出反应。然后,一个所谓的协处理器开始发挥作用。此协处理器等待某个事件发生(如键盘上的键笔画),然后调用中断处理程序。这是一个位于内存中某个地址上的代码块。

想想看,处理器就在上面的计算中,但同时您希望在地址keys上存储键笔画的数量。然后编写一个从地址0x80000180开始的程序(在MIPS中定义为exeption处理程序地址):

代码语言:javascript
复制
lw $at, keys
addi $at, $at, 1
sw $at, keys
eret

现在按一下键会发生什么?

  1. 协处理器会注意到击键。
  2. 保存主进程的当前PC。
  3. 主处理器的PC设置为0x80000180,执行中断代码。
  4. eret上,在中断发生之前将PC设置为主处理器的PC。
  5. 主要计划的执行工作仍在继续。

这里有一个从正常执行到中断处理的切换,在步骤2和步骤3之间,然后再从4切换到5。

注意:我已经简化了很多,但是应该很清楚,中断与函数调用是如何不同的,以及硬件如何必须有额外的中断处理功能。

票数 1
EN

Stack Overflow用户

发布于 2013-07-21 10:04:53

因此,在断言它们是相同的之后,你继续列出它们不同的方式--这也许更能回答你的问题。

关于ISRs的前四点大体上都是正确的。启用中断的要点不一定是这样的,它是程序员的实现决定,可以由体系结构决定,而小规模是指导原则而不是要求--“小”完全是主观的。

不同之处不在于它们是如何编码的(尽管ISR通常会施加一些限制,也可能拥有正常函数所不具备的特权),而在于它们是如何被调用的以及处理器的行为。

函数(或更一般的过程或子例程)必须被显式调用,并且是与其调用者相同的上下文和执行线程的一部分。硬件ISR不是显式调用的,而是由某些外部事件调用的(处理器核心外部,即片上外围设备可能会产生中断)。当中断被调用时,当前线程的上下文在切换到ISR之前会自动保留。返回时,反向上下文切换会在中断之前恢复处理器的状态,以便从中断点继续执行。

这种机制可能由于多线程操作系统或调度器的存在而变得复杂,ISR本身可能会导致线程上下文切换,以便在从ISR返回时切换到不同的执行线程或上下文。在这种情况下,这些机制由操作系统管理。

有些处理器支持另一种ISR --软件中断。软件中断就像函数调用一样被指令而不是单个事件显式调用,但提供了一个间接机制,使调用者不需要知道ISR的地址,实际上该地址可能会改变。从这个意义上说,它与通过指针调用函数没有什么不同,但是因为它是一个ISR,所以它在中断上下文中运行,而不是在调用者的上下文中运行,因此可能具有普通函数没有的限制和特权。

从根本上说,中断能够对事件做出直接和决定性的响应,否则您可能会轮询或测试某个事件,然后处理它,但只能在您选择测试它时处理它,而不是在它实际发生时处理,这可能是可变的,而且时间长得令人无法接受。

票数 4
EN

Stack Overflow用户

发布于 2013-07-21 09:16:25

主要区别在于,中断处理程序(通常)是由外围硬件调用的--外围设备生成实际的硬件信号,处理器中的硬件将控制转移到适当的处理程序,而中断之前运行的代码不采取任何操作。与函数不同的是,处理器硬件不会从中断的代码中删除调用执行。

在支持多线程/进程的操作系统上,函数调用与调用者使用相同的进程/线程上下文。中断OTOH没有线程或进程上下文--在编辑Word文档时可能会发生由后台BitTorrent下载产生的网络中断,因此处理程序的操作非常有限。它可以将数据加载到/从它绑定到的进程/线程的预分配缓冲区中,它可以向信号量发送信号,也可以设置OS事件标志。事情就是这样。

通常,中断处理程序直接执行中断返回,从而允许执行被中断的代码以消除任何进一步的干扰。在更简单的控制器上,比如yopur 8051,通常在没有竞争操作系统的情况下运行嵌入式代码,这是唯一可用的方法。对于抢占式多线程操作系统,中断处理程序可以通过操作系统代码执行中断返回,从而导致调度程序运行。这允许中断处理程序使等待中断的线程做好准备,并可能运行(因此可能会抢占原来被中断的线程)。这允许这样的系统在没有任何轮询的情况下具有良好的I/O性能。

硬件中断来源于嵌入在处理器芯片中的I be外围设备--网络控制器、磁盘控制器、显示控制器、DMA控制器、USB控制器、内核-通信控制器、(在多核处理器上)、定时器等或包上的中断请求引脚/s,可以用来从外部硬件源(可能是按钮、键盘、键盘或触摸屏硬件)产生中断。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17768026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档