跳转到而不调用C中的函数,而无需使用堆栈(回调函数)

问题描述 投票:0回答:1

我在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。

callback stack interrupt goto
1个回答
0
投票

只需编写良好的C代码。

int second(int x);

int first(int x)
{
    return second(x);
}

任何受人尊敬的编译器都会检测到尾调用,并且如果启用了适当的优化,则会发出“跳转”指令而不是调用。例如:

first:
    jmp second

https://godbolt.org/z/9s3iPt

© www.soinside.com 2019 - 2024. All rights reserved.