【问题标题】:Jump to, not call, a function in C without using stack (callback function)在不使用堆栈的情况下跳转到而不是调用 C 中的函数(回调函数)
【发布时间】:2019-12-15 20:47:42
【问题描述】:

我在 C 中有一个中断,它将调用“回调”函数。 CallBack 只有一行可执行代码,它调用了 YetAnotherFunction。

然后让 CallBack 使用普通的 C 调用约定(将返回地址推送到堆栈然后跳转到 YetAnotherFunction,)有没有办法可以在不推送的情况下跳转到 YetAnotherFunction?

Interrupt、CallBack 和 YetAnotherFunction 位于单独的文件中,并在链接时放入可执行文件中。

推理...

我有一个每秒被调用一百次的中断。反过来,它每秒调用 YetAnotherFunction 4 次。

我想让中断更通用,所以我想创建一个通用的回调函数。在一个项目中,CallBack 将调用 YetAnotherFunction。在其他项目中,它会简单地返回而不做任何工作。

这个,因为我想把中断例程放在我的通用库中,而且Callback在每个项目中可以是唯一的。

目前,在 CallBack 中,我使用 C 结构调用 YetAnotherFunction,但我想到会将返回地址压入堆栈,并且在从 YetAnotherFunction 返回时需要第二次“反弹”。虽然这并不多,但它冒犯了我的强迫症。

有没有一种方法可以从 CallBack 中直接跳转到 YetAnotherFunction 而无需将地址压入堆栈?这样,当从 YetAnotherFunction 返回时,直接返回给中断调用者。

感谢您的帮助,马克。

PS,我必须将 CallBack 或 YetAnotherFunction 声明为中断吗?从中断处理程序中调用函数时,我应该考虑任何隐藏的“陷阱”吗?

另外,我可能错误地使用了术语回调,但我想你明白了。

谢谢。 M.

【问题讨论】:

    标签: callback stack interrupt goto


    【解决方案1】:

    只需编写好的 C 代码。

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

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

    first:
        jmp second
    

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

    【讨论】:

    • 你去。我不知道,谢谢@Jonathon。我会测试它并让你知道。具体来说,我正在使用 TI 的 Code Composer Studio 中包含的编译器为其 Piccolo TMS320F28027 创建代码。它确实有几个级别的优化(其中大部分我已经关闭,所以我可以在单步执行时更好地理解汇编级别的调试。)我将尝试各种级别的优化。嗯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2015-01-06
    • 2014-11-13
    • 2018-10-20
    • 2018-05-14
    • 2018-10-16
    • 2012-06-22
    相关资源
    最近更新 更多