malloc 如何知道第一个可用块在嵌入式系统中的位置?

How does malloc know where the first available block is in embedded systems?

我读到 malloc 有多个依赖于平台的实现。

裸机编程在嵌入式设备中是如何工作的?
假设我们有一个带有 256KB 闪存和 64KB RAM 的单片机。

它如何知道我的程序有多少可用 RAM?

对于裸机系统,您将在链接描述文件中分配一个特定的段,通常称为 .heap。进程之间没有内存共享这样的东西,这意味着堆必须有一个固定的最大大小,因此一般来说是非常无用的。 malloc 不知道您的程序使用了多少 RAM,因为看不到桌面 OS。

您的 RAM 分为 .stack.data.bss.heap,每个都有自己固定的最大大小。更多关于这些细分市场的信息:https://electronics.stackexchange.com/a/237759/6102。在典型的裸机 MCU 应用程序中,大部分 RAM 将保留用于 .data.bss。您将为堆栈保留 128 字节到几 kb 的内容。您通常根本没有堆 - 但如果有,它会坐在那里并占用固定数量的 x kb,无论您实际使用了多少。

malloc 本身确实可以用不同的方式实现。要么你包括一个 "header" 连同每个分配的段, header 说明分配的大小和潜在的下一个可用空闲段的地址。或者您可以将其实现为 look-up table,其中每个项目都是指向第一个元素和大小的指针。

None 这一点特别重要,因为您不应该在嵌入式系统中使用堆分配。主要原因是 it doesn't make any sense。您不想要任意行为,您想要确定性行为。你想为最坏的情况分配 x 内存量,如果要使用堆,它至少必须有那么大,所以你除了使用堆膨胀之外什么也得不到。然后是分配开销、碎片和泄漏等所有常见问题。

对于纯粹的 metal/RTOS 应用程序,帮自己一个忙,从您的链接描述文件中删除 .heap,然后忘记您曾经听说过 malloc。 MCU 不是 PC。