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。
我读到 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。