Nil*_*wal 8 embedded operating-system function-calls computer-architecture isr
我想了解ISR(中断服务程序)和函数调用之间的区别.
从硬件的角度来看,我觉得函数调用和ISR都是一样的.如果我错了,请纠正我.我所能找到的有关ISR和函数调用的内容如下:
ISR:
在程序执行期间可能发生的异步事件
将PC,标志和寄存器保存在堆栈中并禁用所有中断并加载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
Run Code Online (Sandbox Code Playgroud)
该代码可以由主处理器处理:算术运算(第 1、7 行)由算术单元完成,内存访问(第 2、4 行)由内存控制器完成,跳转(第 3、5、8 行)也是由主CPU完成的。(实际地址jal是在绑定目标文件期间设置的。)
这是用于函数调用的。在任何时候都可以确定代码现在在哪里以及在下一个时间点执行哪个代码(即当程序计数器递增时:PC+=4)。
现在问题来了,当您的函数执行一些复杂的操作但您仍然希望软件对击键做出反应时。然后所谓的协处理器就开始发挥作用。该协处理器会等待某个事件(例如键盘上的按键)发生,然后调用中断处理程序。这是位于内存中某个地址上的代码块。
想一想,处理器正在进行上面的计算,但与此同时您想要将击键次数存储在地址上keys。然后你从地址开始编写一个程序0x80000180(这在MIPS中被定义为异常处理程序地址):
lw $at, keys
addi $at, $at, 1
sw $at, keys
eret
Run Code Online (Sandbox Code Playgroud)
现在按下按键会发生什么?
eretthe PC 设置为中断发生前主处理器的PC这里,在第 2 步和第 3 步之间有一个从正常执行到中断处理的切换,然后又从第 4 步到第 5 步返回。
注意:我已经对此进行了很多简化,但应该很清楚,中断与函数调用有何不同,以及硬件如何具有用于中断处理的附加功能。