如何检查嵌入式应用程序中的堆栈溢出?

电器工程 嵌入式
2022-01-17 09:49:25

我遇到了一个问题,我认为我的堆栈溢出了。我倾向于这样想的原因是:

1) 编译代码,转储到设备中: - 设备没有活动(我期待“我还活着”消息)
2) 在这种情况下,我将堆栈大小增加了 10 个字节,重新编译并转储到设备,问题就消失了。
3)以上两个步骤来回尝试了10次,可以可靠地重现问题,并可靠地修复它。

我想看到堆栈倒塌,我该怎么做?

我目前正在使用 M16 微控制器,具有 2K RAM(剩余 30 字节),256 字节堆栈大小。我正在使用的 IAR Workbench 没有调用图实用程序。

还有其他方法可以做到这一点 - 检查堆栈倒塌以及代码中有多少?

任何帮助将不胜感激。

谢谢!

3个回答

检查内存使用情况的一种常用方法是在程序运行之前用一个常量值预填充内存。例如,您的启动代码可以将一系列 0xde 0xad 写入您的堆栈区域。在程序运行期间,堆栈将增长并覆盖这些序列。如果您随后有能力检查内存,那么您可以轻松查看内存中未触及的 0xde 0xad 字节,从而确定已使用了多少堆栈。

通常很难检测到溢出,因为函数调用返回地址存储在堆栈中,并且任何函数返回都会将程序发送到杂草中。在这种情况下,如果您的看门狗已启用并且您可以在复位向量处设置断点,您可能仍然能够检查内存并查找您的预填充字节以确定这是否是导致复位的原因。

创建一个位于堆栈顶部(或底部)的变量。在 main 的开头初始化变量。您可以在主循环中检查变量的值,以查看堆栈溢出的事后情况。或者,如果您的调试器允许,则在写入该变量时设置一个断点。只有在初始化时才应该编写它。

有一些程序可以进行静态分析。您可以使用Splint获取一些信息,因为它使用您的源代码检查问题。我认为它不会检查堆栈问题,但可以为您提供有关问题的一些见解。