malloc在嵌入式c中的使用

kal*_*ppa 3 c embedded

在嵌入式 c 编程语言中。malloc 在单任务嵌入式系统中有用吗?

我在嵌入式系统中工作了 0.5 年。我从未在 8 位控制器编程中使用过 malloc。

有人可以建议我在 8 位控制器编程中使用 malloc 吗?

sg7*_*sg7 7

在嵌入式系统中,强烈不鼓励使用动态分配。关键系统的行为应该是确定性的。许多用于嵌入式固件的库和操作系统都避免使用动态分配。

关于为什么 malloc 不适用于嵌入式系统的简短解释,请参阅:malloc sins

关键系统的标准可能会禁止将 malloc 用作不良的编程实践。

例如,MISRA C1 和 MISRA C2 不允许使用 malloc/calloc。参见MISRA标准。

问答:动态内存分配 - MISRA 公告板


Lun*_*din 5

不,它没有用。整个目的malloc是让多个进程在需要时动态共享系统的所有可用 RAM 内存。这反过来意味着您有一个多进程系统,并且可用 RAM 的数量很大,但也是可变的或未知的。

在“裸机”(无操作系统)或使用 RTOS 的较小嵌入式系统中,这种内存共享没有任何意义。与 PC 不同,这种嵌入式系统是完全确定的,因此您始终知道最坏情况下所需的 RAM 量。您还确切知道芯片上有多少 RAM。

malloc在此类系统上使用的需求通常源于困惑的 PC 程序员,他们在没有先学习嵌入式编程的情况下学习了嵌入式编程。

详情请看这里

  • @infixed 总结:如果你真的知道你在做什么,你会得到比在不知道它实际做什么的情况下盲目调用 malloc 的程序更高效。后者是PC程序员的思维方式,只会在设计嵌入式系统时带来悲伤和痛苦。您必须完全控制您的程序使用多少内存,期间。提供可能突然耗尽内存的固件不是专业的工程,那只是骗局。 (4认同)
  • @infixed 在确定性嵌入式系统中不存在“可变大小的内存对象”的情况。必须始终有一个上限。您必须针对最坏的情况进行设计,您必须有足够的内存来处理最坏的情况,仅此而已。见我链接的帖子。 (3认同)
  • 它既不是 malloc 的全部、唯一甚至主要用途。你不能那么强调它的有用性或其他方面。有用性和可取性不是一回事。 (3认同)
  • 我认为 `malloc` 在程序创建可变大小内存对象的单线程应用程序中很有用。比如说保存字符串。如果您可以从空闲内存池中分配可变大小的块,那么您可以创建比它们都具有固定大小的更多对象。但它确实让您担心碎片化、垃圾收集和内存泄漏。 (2认同)
  • @伦丁。您知道存储速度和权衡的层次结构并不是一个新概念。*没有人*提倡盲目调用`malloc`。随着嵌入式系统变得越来越强大,它们正在进入不久前常规系统运行的领域。也许你想让你的确定性系统做一些事情,例如,每次使用数据时通过 SPI 从 SD 卡中获取相同的数据,而不是将它缓存在 RAM 中。我不。是的,必须处理最坏的情况。这并不意味着您必须 100% 的时间都生活在其中 (2认同)