我听说Enea的OSE的malloc实现不是很有效-有人知道他们是否使用了像ptmalloc2这样的标准malloc吗?
如果有人通过将其他malloc移植到Enea的OSE来获得更好的结果,我会很感兴趣。
在任何实时多线程系统中,malloc()
的基本问题都是不确定性行为和线程安全。
可以想象OSE实现至少是线程安全的。不确定的分配时间可以通过不在实时关键代码中分配来处理(例如在初始化期间,或者仅在非关键后台线程中)。
出于线程安全的原因,许多RTOS库提供malloc实现,但同样许多用于嵌入式系统的标准库实现提供互斥存根,因此标准库实现也可以是线程安全的。请查看库中有关线程安全的文档。
为了解决实时关键代码中的不确定性问题,可以使用固定的块分配器。OSE可以直接提供,但它可以通过预分配(动态或静态)内存块并在队列中放置指向每个块的指针来轻松实现。要分配一个块,只需从队列中取出一个指针,然后将指针放回队列即可释放它。如果队列为空,则表示内存不足。多个队列,每个队列包含不同大小的块,将在一定程度上提高内存使用率并避免"浪费"。