操作系统 – ISR和函数调用之间的区别?

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

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

ISR:

>在执行期间可能发生的异步事件
该程序
>将PC,标志和寄存器保存在堆栈中
禁用所有中断并加载ISR的地址
> ISR不能有可传递给它的参数
>无法返回值
>启用中断
>通常很小,因为他们正在花时间进行其他一些过程
>一些ISR有自己的堆栈

功能:

>在有函数调用时发生
>将PC和寄存器保存在堆栈中
>可以有参数
>可以返回值
>对执行的大小和持续时间没有限制

除此之外还有什么区别吗?请告诉我.
我还读过关于从ISR进行函数调用的方法.请突出显示它.

它们不一定与你在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

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

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

现在有了这一点,当你的函数做了一些复杂的事情,但你仍然希望软件对一个关键的笔划作出反应.然后一个所谓的协处理器发挥作用.此协处理器等待直到某个事件(如键盘上的按键)发生,然后调用中断处理程序.这是位于存储器中某个地址的代码块.

想想,处理器在上面的计算中,但同时你想在地址键上存储击键次数.然后你编写一个从地址0x80000180开始的程序(这被定义为MIPS中的exeption处理程序地址):

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

现在击键会发生什么?

>协处理器了解击键
>保存主处理器的当前PC
>主处理器的PC设置为0x80000180,执行中断代码
>在发生中断之前,PC将被设置为主处理器的PC
>那里继续执行主要的程序.

这里有从正常执行切换到步骤2和3之间的中断处理,再从4到5的切换.

注意:我对此进行了简化,但应该清楚,中断与函数调用有何不同,以及硬件如何具有中断处理的附加功能.

相关文章
相关标签/搜索