7

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

我觉得函数调用和ISR在硬件方面都是一样的。如果我错了,请纠正我。 所有我能找到关于ISR和函数调用如下:

ISR:

  • 能的 程序执行过程中的任何时候发生的异步事件

  • 保存PC,标​​志和堆栈上的寄存器和 禁用所有中断并加载ISR的地址

  • ISR不能有可以传递给它的参数

  • 不能返回值
  • 激活中断
  • 一般小,因为他们正在采取一些其他进程
  • 一些ISR都拥有自己的时间堆栈

功能:

  • 曾经有一个函数调用

  • 时,保存在栈上的PC和寄存器

  • 可以有参数

  • 可以返回值

  • 没有限制的大小发生和执行时间

除此之外是否还有其他区别?请告诉我。 我也读过有关ISR的函数调用如何发生。请突出显示它。

回答

1

它们不一定像你在ISR上说的第一点一样:中断是异步的,因此必须以某种方式'中断'主处理器的工作。

例如,让我们看看这个MIPS代码装饰有地址,不使任何有用的东西:

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 

此代码可以从主处理器handeled:算术操作(线1,7)由算术单元完成,存储器控制器的存储器访问(第2,4行)以及跳转(第3,5,8行)也由主cpu完成。 (jal的实际地址在绑定目标文件时设置。)

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

现在有来了一点,当你的函数做一些复杂的,但你仍然希望软件上击键反应。然后一个所谓的协处理器开始发挥作用。该协处理器等待,直到发生某个事件(如键盘上的按键),然后调用中断处理程序。这是位于内存中某个地址上的一段代码。

认为,该处理器在计算上面,但在此期间要存储在地址keys击键次数。然后你写一个PROGRAMM起始地址为0x80000180(这被定义为MIPS的exeption处理程序地址):

lw $at, keys 
addi $at, $at, 1 
sw $at, keys 
eret 

现在是什么在按键发生什么呢?

  1. 协处理器得到了解的击键
  2. 为主。处理器的当前PC保存
  3. 主处理器的PC设置为0x80000180,中断代码被执行
  4. eret的PC设置到主处理器的PC中断发生
  5. 前主progamm的执行继续存在。

在这里有正常执行一个开关中断步骤2和3之间,处理再次从4至5

注:我已经简化了这个有很多,但它应该是清楚的,怎么中断与函数调用不同,以及硬件如何具有中断处理的附加功能。

+0

可惜我不能提供在线资源,因为这依赖于计算机系统的书面脚本利用;) – contradictioned

+0

所以做这意味着像8051那样的微处理器或不具有协处理器的微控制器8091将具有相同的中断和功能调用?请帮助我,我真的很困惑 –

+1

我不是微控制器的专家,但在这个网站是8051的框图:http://aninditadhikary.wordpress.com/tag/intel-8051/你可以看到'Interrupt Control',放在cpu旁边,类似于mips协处理器。 – contradictioned

2

主要区别在于中断处理程序(通常)由外设硬件调用 - 实际的硬件信号由外设生成,并且处理器中的硬件将控制权转移给相应的处理程序,在中断之前运行。与函数不同,没有调用 - 执行从处理器硬件中断的代码中被剥离。

在支持多线程/进程的OS上,函数调用在与调用方相同的进程/线程环境中发生。中断,OTOH,没有任何的线程或进程上下文 - 从后台下载BitTorrent的产生可能发生,而你正在编辑Word文档,所以处理程序在什么可以做的非常受限的网络中断。它可以从属于该进程/线程,它被绑定到,它可以发送一个信号量预先分配的缓冲器加载数据到/,它可以是能够设置OS事件标志。就是这样。

通常,中断处理程序直接执行中断返回,因此允许被中断代码的执行进行wtihout任何进一步的干扰。在比较简单的控制器上,例如yopur 8051,它通常运行嵌入式代码而没有运行系统,这是唯一可用的方法。使用抢先式多线程操作系统,中断处理程序还可以通过操作系统代码执行中断返回,从而导致调度程序运行。这允许中断处理程序创建正在等待中断的线程,并且可能正在运行(并且可能抢占最初中断的线程)。这允许这样的系统在没有任何轮询的情况下具有良好的I/O性能。

硬件中断源我被外围设备嵌入在处理器芯片 - 网络控制器,磁盘控制器,显示控制器,DMA控制器,USB控制器,intercore-通讯科控制器,(在具有多个核的处理器),定时器等,或中断 - 封装上的请求引脚可用于从外部硬件源(可能是按钮,键盘,小键盘或触摸屏硬件)产生中断。

2

因此,声称他们是一样的,你继续列出他们不同的方式 - 这或许可以回答你的问题。

关于ISR的前四点广泛而全面正确。有关启用中断的点并不一定的情况下,是由程序员的实现决策,并且可以由体系结构来确定,并且是小是一个指针不是必需的 - 和“小”完全是主观”

。这些差异并不在于它们是如何编码的(尽管ISR通常会施加许多限制,并且也可能具有正常功能所不具备的特权),而是在它们如何被调用以及处理器的行为方面。

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

该机制可能因多线程操作系统或调度程序的存在而变得复杂,因此ISR本身可能会导致线程上下文切换,以便在从ISR返回时切换另一个执行线程或上下文。这种机制在这种情况下由操作系统管理。

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

基本上,中断能够直接和确定性地对事件做出响应,否则您可能会对事件进行轮询或测试,然后处理它,但只能在您选择测试它时而不是在其实际发生时进行处理,这可能是可变的和不可接受的长。

1

上述答案非常完整...... Clifford提供的软件中断特别说明。

我唯一能做的就是这个。存储在函数调用中的寄存器上下文由CPU架构的过程调用约定定义。这通常意味着调用者将一些东西保存在堆栈中,被调用者保存一些东西,并且几乎是一个静态集合。例外:具有注册保存/恢复动态窗口的IA64。

在ISR上,唯一存储的寄存器上下文是将在ISR中使用的内容。如果使用一个寄存器,则只有该寄存器被保存/恢复。

在大多数cpus中,由于过程调用约定的静态性质,在函数调用中存储/恢复的寄存器集远大于ISR中存储/恢复的寄存器集。

0

函数调用通常是程序生成的。

中断通常由硬件产生。

例如:如果您使用C语言编程,您可以通过调用该函数来调用函数。有主功能和子功能。子功能由程序员编程。

但是,中断是硬件特定的。例如: 在计算机中,CPU正在处理程序并运行它。如果按键盘上的某个键,键盘会将键盘中断设置为cpu。现在CPU可以采取按键操作。

总结的最好方法是? 1.函数由程序员创建。 2.中断物理设计到硬件以及其他硬件 https://www.youtube.com/SaqibJaved

相关问题