c - 我怎么知道我的内存何时已满?

标签 c memory stack stack-overflow microcontroller

我正在用 c 为 Atmel XMEGA 微 Controller 编写固件,我想我填满了 4 KB 的 SRAM。据我所知,我只有静态/全局数据和本地堆栈变量(我 不要 在我的代码中使用 malloc)。

我使用局部变量来缓冲一些像素数据。如果我将缓冲区增加到 51 字节,我的显示器会显示奇怪的结果 - 6 字节的缓冲区运行良好。这就是为什么我认为我的 ram 已满并且堆栈正在覆盖某些内容。

创建更多可用内存是 不是 我的问题是因为我可以将一些静态数据移动到闪存中,并且仅在需要时才加载它。令我烦恼的是,我可能永远不会发现内存已满。

当内存被填满而不是让它覆盖一些其他数据时,是否有可能以某种方式检测(例如通过重置微 Controller )?

最佳答案

准确预测您需要多少堆栈可能非常困难(如果您打开正确的选项,某些工具链可以试一试,但这只是一个粗略的指南)。

检查堆栈状态的一种常用方法是在启动时用一个已知值完全填充它,尽可能硬/长时间运行代码,然后查看有多少未被覆盖。

您工具链的启动代码甚至可能有一个选项来为您填充堆栈。

不幸的是,虽然概念非常简单:用已知值填充堆栈,计算剩余值的数量,实现它的现实可能需要对特定工具的方式(特别是启动代码和链接器)工作。

检查堆栈溢出是否是导致问题的原因的粗略方法是使所有本地数组“静态”和/或大幅增加堆栈的大小,然后查看是否效果更好。这些在小型嵌入式系统上都很难做到。

关于c - 我怎么知道我的内存何时已满?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4142847/

相关文章:

c - 将 pthread.h 添加到 nds 项目 makefile

c# - 是否有可能在实现 IDisposable 的类的析构函数中调用 GC?

linux - sort 如何计算出有多少 RAM?

java - 使用回溯算法测试鼠标是否可以逃离矩形迷宫

c - 这段代码在做我想做的事吗?

c - 函数参数名称是否在 C 的内存中占有一席之地?

c - 在 C 中使用 sizeof() 运算符时的奇怪情况

c++ - 如何获取 Apple/Mac 上的可用虚拟内存量?

java - 为什么当我连续输入 2 个以上的整数时,我的前缀运算程序不工作?

java - 使用 Java 中的传统 for 循环遍历堆栈