我在C中有一个中断,它将调用“回调”函数。 CallBack只有一行可执行代码,它调用YetAnotherFunction。
而不是让CallBack使用普通的C调用约定(它将返回地址推入堆栈,然后跳转到YetAnotherFunction,)有没有一种方法我可以在没有推入的情况下跳转到YetAnotherFunction?
Interrupt,CallBack和YetAnotherFunction位于单独的文件中,并在链接时放入可执行文件。
理由...
我有一个每秒被调用一百次的中断。它依次每秒调用YetAnotherFunction 4次。
我想使中断更通用,所以我想创建一个通用的CallBack函数。在一个项目中,CallBack将调用YetAnotherFunction。在其他项目中,它将不做任何工作而直接返回。
这是因为我想将中断例程放在我的通用库中,并且Callback在每个项目中可以是唯一的。
[当前,在CallBack中,我使用C结构来调用YetAnotherFunction,但是在我看来,它将把返回地址压入堆栈,并且从YetAnotherFunction返回时需要第二个“反弹”。尽管数量不多,但是它冒犯了我的OCD。
有没有一种方法可以从CallBack中直接跳转到YetAnotherFunction而不将地址压入堆栈?这样,当从YetAnotherFunction返回时,它直接返回到中断调用者。
感谢您的帮助,马克。
PS,我必须将CallBack或YetAnotherFunction声明为中断吗?从中断处理程序中调用函数时,是否应该考虑任何隐藏的“陷阱”?
此外,我可能未正确使用回调一词,但我想您明白了。
Thx。 M。
只需编写良好的C代码。
int second(int x);
int first(int x)
{
return second(x);
}
任何受人尊敬的编译器都会检测到尾调用,并且如果启用了适当的优化,则会发出“跳转”指令而不是调用。例如:
first:
jmp second