【问题标题】:What happens when we run out of memory on an Cortex M3当我们在 Cortex M3 上耗尽内存时会发生什么
【发布时间】:2013-06-28 08:12:24
【问题描述】:

我正在为 ARM 处理器开发一个带有 C 的程序,在我的程序中,当我的内存使用量增加时(当程序流经其中定义了数组的函数时)程序的行为异常,我认为某些变量被覆盖,也就是说,当它耗尽内存时,它会从头开始分配内存。

现在我的问题是:覆盖旧变量是否是内存不足时的行为?如果是,我该如何避免这种情况?

我正在使用 Keil uVision 和 lpc 1768。

感谢您的帮助。

【问题讨论】:

  • 吹毛求疵:LPC1768 是 Cortex M3 而不是 ARM7。

标签: c memory arm keil


【解决方案1】:

是的,你是对的。当堆栈内存已满时,它会从底部地址(0x00..0)开始填充它。这会导致旧变量被覆盖并且程序出现意外行为。 解决方案:解决这个问题最简单的方法是永远不要直接定义数组,而是使用 malloc 或 calloc 分配内存并尽快释放内存。这可以防止内存被覆盖。这也是一种很好的做法。

【讨论】:

  • 使用 malloc 或 calloc 分配内存不是一个好建议。OP 使用的嵌入式平台必须具有低内存。在堆上工作并不安全。
  • @Dayalrai 你说得对,我的内存有限,大多数数组都在我正在使用的库中。您还有其他建议吗?
  • @msn 你应该处理堆栈大小,Keil uVision 中有一些选项可以编辑最大堆栈大小。
【解决方案2】:

1) 是的。由于内存不足,会发生过度写入旧变量 2)为了避免这种情况尝试最小化数组大小,或者您可以增加堆栈大小。在 Keil uVision 中有增加堆栈大小的选项。这可能会解决您的问题

【讨论】:

  • 增加堆栈大小没有帮助,我想知道为什么!你有什么想法吗?
猜你喜欢
  • 2013-06-09
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2011-11-07
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多