【问题标题】:How to know the return address of a function?如何知道函数的返回地址?
【发布时间】:2011-11-14 14:18:41
【问题描述】:

在我的代码中,控制是从中断服务程序跳转到某个 X 函数。执行该 X 函数后,它正在执行重置,因为它不知道应该返回到哪里。您能告诉我从中断服务程序跳转到函数 X 时需要注意哪些寄存器吗?

场景:

Function m() {
    Function x();
}

Function x() {
    Step1:
    Step2:call Function Y();
    Step3: 
}

Function y() {
    Step1:Enable interrupt;
    Step2:call function z();
    step3:disable interrupt;
}

interrupt() {
    Step1:Jump Step 3 of function x();
}

说明:函数 Z 应该在一段时间内执行,所以我使用定时器中断来实现该超时。我在中断服务例程中给出函数 x() 地址的第 3 步,以便在特定时间后控制权将返回(通过更改 PC 地址实现跳转)。

硬件:NEC V850E2 处理器,GHS 编译器。 软件:嵌入式 C。

【问题讨论】:

  • 您是说您正在使用 ISR 来“杀死” Z() 的执行,并将控制权恢复到 X()?这很棘手;通常,您需要展开堆栈。或者,您可能想研究 setjmp 和 longjmp。
  • 是的,你的理解是正确的..有点棘手,但我必须这样做......

标签: c


【解决方案1】:

如果 GHS compilers 与 GCC 非常兼容(正如他们声称的那样),他们可能拥有 GCC __builtin_return_address(但这不是标准的,并且特定于 GCC)。

最近的 GCC 是否支持您的目标系统?如果是,那么从源代码构建 GCC 可能是值得的。

否则你需要自己编写汇编代码。

【讨论】:

  • 对不起..GHS 和 GCC 都是完全不同的编译器...我无法使用该功能...
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多