【问题标题】:Creating new memory regions for heap / stack for voracious algorithm为贪婪算法的堆/堆栈创建新的内存区域
【发布时间】:2017-03-23 19:42:01
【问题描述】:

在 IAR 内存配置设置中使用了手动范围,并在所有可用的剩余内存上创建了一个新的读/写区域(直到 0xFFFFFFFF)。然后将此区域附加到堆/堆栈的链接器中。扩展STM32芯片(IAR编译器)上程序存储器资源的可用方法是否正确?

如果只对标准库函数集进行数学计算,如何在芯片上获得尽可能多的内存?

该算法使用了很多现在分配在动态内存中的中间缓冲区(例如堆),它在嵌入式系统上是正确的方法吗?我想数组太大了,C VLA 会占用太多的堆栈位置。数据是动态的,例如我们不知道数组的大小,也不能静态预分配它。

我还发现内存配置中有很多 SFR 类型的块(每个大约 256 Mb!)标记为 ExtDev*。如果它是“特殊功能寄存器”,它怎么能是一个内存?这个内存区域是什么意思,我可以写给他们吗?

谢谢

【问题讨论】:

  • 关于大相径庭的问题太多不同的问题。发布单独的问题。创建一个不存在的内存区域肯定行不通,虽然 Cortex-M 上的地址范围是 32 位,但即使你有外部存储器,STM32 也不支持那么多。 SFR 是内存映射的。其中没有 256Mb - 这仅仅是为它们保留的内存分区。还有位带区域。阅读该部件的数据表和参考手册,以及 ARM Cortex-M 技术数据,了解内存是如何映射的。
  • 即使您不知道将使用多少内存,您仍然需要对可以处理的内容设置限制。一旦您设置了限制,您就可以预先分配内存使用量。您问 - 在嵌入式系统上使用动态内存是一种正确的方式吗?通常不会,没有磁盘交换,内存在频繁分配和释放后会产生碎片,导致贪心算法缺乏足够的内存。一个好的内存管理器会合并连续释放的内存块,但不会合并使用的块,因为它不能改变正在使用的指针。

标签: memory embedded iar


【解决方案1】:

如果只对标准库函数集进行数学计算,如何在芯片上获得尽可能多的内存?

如果不更换具有更多内存的芯片,您就无法更改微控制器内的 RAM 容量。因此,您需要以最佳方式使用您拥有的 RAM。

现在分配在动态内存中(例如堆),它在嵌入式系统上是否合适?

不,因为在微控制器上使用它没有任何意义。 See this.

数据是动态的,例如我们不知道数组的大小,也不能静态预分配它。

当然你事先知道数组的大小。大小小于芯片上可用的 RAM。因此,您需要指定最大允许值。这反过来意味着您可以并且必须静态地预先分配空间,因为您需要处理数组大小 == 允许的最大值的情况。

如果您要使用堆,那么在最坏的情况下,您仍然需要有那么多可用的内存,因此堆在这里没有用处,也不会为您节省任何内存。完全摆脱堆并以更好的方式使用该内存。

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 2012-05-25
    • 2016-06-29
    • 2016-10-04
    • 2016-03-25
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多