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