C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了内存管理 – 为什么我们不应该在嵌入式系统中拥有不同大小的动态分配内存大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在嵌入式系统中听说过,我们应该使用一些预先分配的固定大小的内存块(比如好友内存系统?).有人能给我一个详细的解释原因吗?
谢谢,

解决方法

在嵌入式系统中,内存非常有限.因此,如果你偶尔会丢失一个字节的内存(因为你分配了它,但你没有释放它),这将很快耗尽系统内存(1 GB的内存,泄漏率为1 /小时将占用它时间.如果你有4kB内存,不会那么久)

本质上,避免动态内存的行为是避免程序中的错误的影响.由于静态内存分配是完全确定的(而动态内存分配不是),通过仅使用静态内存分配,可以抵消此类错误.其中一个重要因素是嵌入式系统通常用于安全关键应用程序.几个小时的停机可能会花费数百万美元,或者可能发生事故.

此外,取决于动态内存分配器,不确定性也可能需要不确定的时间,这可能导致更多的错误,尤其是在依赖严格时序的系统中(由于@L_801_7@提到这一点).这种类型的错误通常难以测试和重现,因为它依赖于非常具体的执行路径.

此外,嵌入式系统通常没有MMU,因此没有内存保护.如果内存不足并且处理该条件的代码不起作用,最终可能会执行任何内存作为指令(可能会发生错误!但这种情况只与动态内存分配间接相关).

正如Hao Shen所述,分裂也是一种危险.它是否可能发生取决于您的确切用例,但在嵌入式系统中,由于碎片,很容易丢失50%的RAm.如果分配的块总是具有完全相同的大小,则只能避免碎片.

性能也起作用(取决于用例 – 感谢Hao Shen).静态分配的内存由编译器分配,而malloc()和类似的内存需要在设备上运行,因此消耗cpu时间(和功率).

许多嵌入式操作系统(例如ChibiOS)支持某种动态内存分配器.但使用它只会增加发生意外问题的可能性.

请注意,通常使用较小的静态分配内存池来规避这些参数.这不是一个真正的@R_419_2495@案,因为在这些池中仍然可能耗尽内存,但它只会影响系统的一小部分.

正如Stephano Sanfilippo所指出的,某些系统甚至没有足够的资源来支持动态内存分配.

注意:大多数编码标准,包括the JPL coding standard和DO-178B(对于关键的航空电子设备代码 – 感谢[Stephano Sanfilippo])(https://stackoverflow.com/users/2344584/stefano-sanfilippo)禁止使用malloc.

我还假设MISRA C standard@L_898_26@malloc()因为this forum post – 但我无法访问标准本身.

大佬总结

以上是大佬教程为你收集整理的内存管理 – 为什么我们不应该在嵌入式系统中拥有不同大小的动态分配内存全部内容,希望文章能够帮你解决内存管理 – 为什么我们不应该在嵌入式系统中拥有不同大小的动态分配内存所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。