在嵌入式系统中处理堆栈溢出 [英] Handling stack overflows in embedded systems

查看:323
本文介绍了在嵌入式系统中处理堆栈溢出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在嵌入式软件中,如何以通用方式处理堆栈溢出?
我遇到一些处理器,以像最近的AMD处理器那样以硬件方式进行保护。
维基百科有一些技巧,但那些真实的实践方法呢?

In embedded software, how do you handle a stack overflow in a generic way? I come across some processor which does protect in hardware way like recent AMD processors. There are some techniques on Wikipedia, but are those real practical approaches?

任何人都可以提供一个明确的建议方法,在所有情况下都适用于今天的32位嵌入式处理器?

Can anybody give a clear suggested approach which works in all case on today's 32-bit embedded processors?

推荐答案

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

Ideally you write your code with static stack usage (no recursive calls). Then you can evaluate maximum stack usage by:


  1. 静态分析(使用工具)

  2. 堆栈使用,同时运行您的代码与完整的代码覆盖(或尽可能高的代码覆盖,直到您有一个合理的信心,您已经建立了堆栈使用的程度,只要你的很少运行的代码不使用特别多的堆栈正常执行路径)

但即使如此,您仍然希望有一种检测的方法,那么如果发生这种情况,那么处理堆栈溢出,如果可能的话,更加鲁棒。这在项目开发阶段尤其有用。 检测的一些方法:

But even with that, you still want to have a means of detecting and then handling stack overflow if it occurs, if at all possible, for more robustness. This can be especially helpful during the project's development phase. Some methods to detect overflow:


  1. 如果处理器支持内存读/写中断(即内存访问断点中断),那么它可以配置为指向堆栈区域的最大范围。

  2. 在内存映射配置中,设置一个小(或大)的RAM块,它是一个堆栈守卫区域。用已知的值填充它。在嵌入式软件中,定期(经常合理地)检查该区域的内容。如果它发生变化,则假定堆栈溢出。

一旦检测到它,您需要强>它。我不知道代码可以从堆栈溢出中优雅地恢复的许多方法,因为一旦发生,你的程序逻辑几乎肯定无效。所以你可以做的只是

Once you've detected it, then you need to handle it. I don't know of many ways that code can gracefully recover from a stack overflow, because once it's happened, your program logic is almost certainly invalidated. So all you can do is


  1. 记录错误

  1. log the error

  1. 记录该错误是非常有用的,因为否则症状(意外的重新启动)可能非常难以诊断。

  2. 警告:即使在损坏的堆栈场景中,日志记录程序也必须能够可靠地运行。这个例程应该很简单。即使用损坏的堆栈,您可能无法尝试使用您花哨的EEPROM写入背景任务写入EEPROM。也许只需将错误记录到为此目的而保留的结构中,在非初始化RAM中,然后可以在重新启动后检查错误。


  • 重新启动(或者可能关机,特别是如果错误重复出现)

  • Reboot (or perhaps shutdown, especially if the error reoccurs repeatedly)


    1. 可能的替代方法:重新启动特定任务,如果您使用的是RTOS,并且您的系统被设计为使得堆栈损坏被隔离,并且所有其他任务都能够处理该重新启动的任务。这将需要一些严格的设计考虑。


  • 这篇关于在嵌入式系统中处理堆栈溢出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆