为什么中断服务程序不允许有返回值啊?请各位高手指教,多谢
看到过好多题目是给出一段有返回值的中断服务程序让找错误,答案是:中断服务程序不允许有返回值啊
中断服务程序只是由系统调用的,就不能有返回值么,是对寄存器有影响还是返回值没有意义,还是其他什么原因阿??
中断不能压栈,所以不能有返回值,如果能压栈的话很快内存空间没了..并且中断特点就是在任何时候进行的并且保护现场的,如果要记住入口点和出口点不是重复,那么中断没有意义
中断的本质意义是去处理突发事件,它的存在是为了处理一个过程,而不是一个特定的预期功能,所以从这去看,不允许参数,不允许返回值就很实在了....
不过可以通过变通的方法,小心地访问全局变量,就可以了.
呵呵
要小心哈
终端处理函数与一般子函数的区别,
硬件原理都不一样。
还是复习下微机原理吧。
to:hefuhua
好像以前在哪里见过,说中断是可以压栈的吧,而且中断时可以进行一些指针和寄存器的压栈操作!
下面是一种说法(其他高手说的)
中断处理的压栈对象依赖于MCU的实现,某些MCU支持一个单独的中断堆栈,在这种情况下自然压入专门的中断堆栈,而一些MCU不支持单独的中断堆栈,OS会相应的将中断堆栈实现在被中断任务的堆栈中,则可以认为是压入被中断任务的堆栈
如果像上边这样的话那中断可以压栈也就可以容纳返回值啊?到底是因为不需要而不返回还是什么原因?
to:amaverick,我马上去看,这方面看的很少,发现软件搞到一定程度对硬件层面不了解就很难深入了,谢谢
硬件中断的返回点是不确定的,也就是现场不能处理返回值。
如果你在中断里压栈作为返回值,而应用程序不处理自然爆掉了。
中断程序里当然可以压栈,但返回前要弹出。
lailaiququ
兄弟说得对啊,
中断返回到不能保证回到原来的地方。 返回值也没有任何意义,
硬件中断返回的是原来的地方,但这个“原来的地方”却是随机的。
而一般子程序则是确定的调用处,软中断与子程序类似。
个人的一点理解
如果说中断服务程序有返回值,那么它的值返回给谁呢?
在系统的运行过程中,一定是某种中断源出发了相应的中断,系统上挂接的中断服务程序进行现场的处理,例如告警等操作,然后清中断。
也就是说,中断服务程序链接在某一类中断源上,而这些中断源的产生是随机的,所以,中断服务程序并没有一个固定的调用者,也没有固定的返回地址,所以返回值也没有用吧。
OK,明白了,返回值是没什么用处!多谢各位指点~~
为什么要有返回值?你有不是在写函数。我认为有2原因,一个原因是不需要;另外一个原因是为了让中断处理程序简单,你当然可以把什么功能都放中断处理里,但是那样还是中断处理程序吗?如果中断处理程序太复杂了,会花太多时间,那样中断就失去意义了,而且还容易引入新的错误,很难处理。
我觉得不应该老是盯在一个点上,关键是你把系统的原理想清楚了,这些问题就不需要问了。
哪的题啊,考这个没什么意思。写一个有返回值的也无所谓,只是外层通常不会处理而已。
所谓中断不会返回原来点是对于进程、线程而已的,实际上中断处理程序外层通常还有一些汇编指令的包装,
总是先回到调用中断处理程序的地方,后续才可能切换任务;至少对于VxWorks来说肯定是这样的。
如果把中断处理的stub修改掉,也可以处理返回值。
有返回值也没有问题,不会有人去判断,处理函数如下:
void mpc107EpicIntHandlerExec
(
UCHAR intVec
)
{
INT_HANDLER_DESC * pCurrHandler;
/* call each respective interrupt handler */
if ((pCurrHandler = sysIntTbl [intVec]) == NULL)
{
logMsg ("uninitalized PIC interrupt vector %x\r\n",
intVec, 0,0,0,0,0);
}
else
{
/* call Each respective chained interrupt handler */
while (pCurrHandler != NULL)
{
(*pCurrHandler->vec) (pCurrHandler->arg); /*这里调用的就是挂接的中断处理函数*/
pCurrHandler = pCurrHandler->next;
}
}
}
返回值的问题,用全局变量的方法来解决的。不过要注意除了该中断外,只能有一个地方去访问该全局变量,最好加个判断什么的,容易出现问题。例如碰到更高优先级的中断什么的,全局的变量的值不好控制。