gpt4 book ai didi

error-handling - 处理嵌入式系统中的堆栈溢出

转载 作者:行者123 更新时间:2023-12-04 05:35:33 26 4
gpt4 key购买 nike

在嵌入式软件中,您如何以通用方式处理堆栈溢出?
我遇到了一些处理器,它确实以硬件方式提供保护,例如最近的 AMD 处理器。
维基百科上有一些技巧,但那些是真正实用的方法吗?

任何人都可以给出一个明确的建议方法,该方法适用于当今的 32 位嵌入式处理器吗?

最佳答案

理想情况下,您使用静态堆栈使用(无递归调用)编写代码。然后您可以通过以下方式评估最大堆栈使用量:

  • 静态分析(使用工具)
  • 在以完整的代码覆盖率运行代码时测量堆栈使用情况(或尽可能高的代码覆盖率,直到您有合理的信心确定堆栈使用的范围,只要您很少运行的代码不使用特别多堆栈比正常执行路径)

  • 但即便如此,您仍然希望有 的方法。检测然后 搬运 堆栈溢出,如果可能的话,以提高健壮性。这在项目的开发阶段尤其有用。一些方法到 检测 溢出:
  • 如果处理器支持内存读/写中断(即内存访问断点中断),则可以将其配置为指向堆栈区域的最远范围。
  • 在内存映射配置中,设置一个小的(或大的)RAM 块,即“堆栈保护”区域。用已知值填充它。在嵌入式软件中,定期(尽可能经常)检查该区域的内容。如果它发生变化,假设堆栈溢出。

  • 一旦你检测到它,那么你需要 handle 它。我不知道代码可以从堆栈溢出中优雅地恢复的许多方法,因为一旦发生,您的程序逻辑几乎肯定会失效。所以你能做的就是
  • 记录错误
  • 记录错误非常有用,否则症状(意外重启)可能很难诊断。
  • 警告:即使在堆栈损坏的情况下,日志记录例程也必须能够可靠地运行。例程应该很简单。 IE。如果堆栈损坏,您可能无法尝试使用您喜欢的 EEPROM 写入后台任务写入 EEPROM。也许只是将错误记录到为此目的而保留的结构中,在非初始化 RAM 中,然后可以在重新启动后进行检查。
  • 重新启动(或者可能关闭,特别是如果错误反复出现)
  • 可能的替代方案:如果您使用的是 RTOS,并且您的系统设计为隔离堆栈损坏,则仅重新启动特定任务,并且所有其他任务都能够处理该任务重新启动。这将需要一些认真的设计考虑。
  • 关于error-handling - 处理嵌入式系统中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185997/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com