我读到malloc
有多个依赖于平台的实现。
它在裸机编程的嵌入式设备中如何工作?
假设我们有一个具有 256KB 闪存和 64KB RAM 的 MCU。
它如何知道我的程序中有多少可用 RAM?
对于裸机系统,将在链接器脚本中分配一个特定的段,通常称为.heap
。进程之间没有内存共享这样的东西,这意味着堆必须具有固定的最大大小,因此通常毫无用处。malloc
不知道您的程序使用了多少 RAM,因为看不到桌面操作系统。
您的RAM分为.stack
、.data
、.bss
和.heap
,每个都有自己固定的最大大小。有关这些细分的更多信息,请访问:https://electronics.stackexchange.com/a/237759/6102。在典型的裸机MCU应用中,大部分RAM将保留用于.data
和.bss
。您将为堆栈保留从 128 字节到几 kb 的内容。您通常根本不会有堆 - 但是如果您这样做,它将坐在那里并占用固定数量的x kb,无论您实际使用多少。
malloc
本身确实可以以不同的方式实施。您可以为每个分配的段包含一个"标头",该标头表示分配的大小以及下一个可用空闲段的地址。或者,您可以将其实现为查找表,其中每个项目都是指向第一个元素和大小的指针。
这些都不是特别相关,因为您不应该在嵌入式系统中使用堆分配。主要原因是它没有任何意义。你不想要任意行为,你想要定性行为。您希望为最坏的情况分配 x 量的内存,如果要使用堆,无论如何它必须至少那么大,因此您只会从使用堆中获得膨胀。然后是分配开销、碎片和泄漏的所有常见问题。
对于裸机/RTOS 应用程序,请帮自己一个忙,从链接器脚本中删除.heap
,然后忘记您听说过malloc
。MCU 不是 PC。