【问题标题】:Use of r1 stack pointer when handling external exception on PowerPC在 PowerPC 上处理外部异常时使用 r1 堆栈指针
【发布时间】:2009-09-28 15:07:45
【问题描述】:

我正在编写一个汇编程序来处理 EABI 嵌入式 PowerPC 应用程序中的 0x500 外部/递减器异常。

在从 0x500 向量点调用的汇编程序例程中,我想在跳转到“C”中的处理函数之前使用一些内存来上下文保存寄存器。

因为 i) 异常模型保证前面的指令在异常处理程序运行时已经完成 和 ii)调用约定似乎首先在进入新函数时更新堆栈指针(r1),然后再使用通过移动它释放的新堆栈空间(并将堆栈指针移回函数末尾的最后一个位置)

在我看来,我可以安全地使用 r1 在异常处理例程中的普通堆栈上为自己留出更多空间,前提是我显然遵守调用约定并将堆栈放回我找到它的方式并确保 SRR0和 SRR1 未修改。

我不会允许在处理过程中使用堆栈的异常嵌套(尽管实际上使用这种方法我不确定是否会出现问题)。

您认为这是一种明智的做法,还是应该使用单独的堆栈来处理异常? - 我认为这可能会带来它自己的问题。

【问题讨论】:

    标签: assembly exception-handling embedded powerpc


    【解决方案1】:

    嵌入式系统以两种方式做到这一点。如果您完全确信堆栈指针将始终指向一个有效的帧,并且堆栈中将有空间容纳您的新帧,那么请继续使用它。如果堆栈指针可能并不总是有效,您应该保存旧的堆栈指针(通常在 SPRG 中)并设置自己的。

    如果您要处理数据访问异常以检测软件错误,您肯定需要设置自己的异常堆栈,因为 DACC 可能是由损坏的堆栈指针引起的。

    【讨论】:

      【解决方案2】:

      在堆栈上保存寄存器上下文的唯一缺点是您可能遇到的异常之一是堆栈溢出!

      【讨论】:

      • :-) 幸运的是,我有大约 98% 的 RAM 可用于堆栈。这是一个比开发板设计运行要简单得多的程序
      【解决方案3】:

      我已将当前上下文保存到当前堆栈中,没有任何问题。

      您需要区分要从中返回的异常和无法返回或无法信任堆栈的“致命故障”异常。 如果您不打算返回,您有两种选择。重新启动堆栈并丢弃所有内容,或者如果您有更多 RAM 切换到异常堆栈,以便可以打印常规堆栈或 ...

      【讨论】:

      • 是的,我复制你所说的关于不同类型异常的内容。我计划使用此方法处理的唯一异常是外部异常,在我的情况下这是一个“好”异常
      猜你喜欢
      • 2010-11-28
      • 2018-07-18
      • 1970-01-01
      • 2016-12-05
      • 2014-12-18
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多