即使有足够的内存,Vxworks内存分配也会失败

时间:2015-05-07 12:04:47

标签: malloc vxworks

我对vxworks很新,我正在构建一个RTP应用程序,它需要动态分配一些内存。我已经为内核配置了750MB的内存。

我在程序的最开始分配块大小为32MB的块10个数字,但是在第5或第6个块分配之后,我在控制台上收到消息memPartAlloc: block too big 15912260 bytes (0x10 aligned) in partition 0xe004608的分配失败。

当有足够的可用内存时,内存分配怎么会失败?我不认为在我的程序开始时内存已经碎片足以使分配失败,并且根据memShow()的输出,确实有足够的可用内存来满足请求。

如果由于任何奇怪的原因确实存在碎片,有没有办法压缩可用空间并继续在Vxworks中?

1 个答案:

答案 0 :(得分:1)

这是一个古老的问题,所以这个答案现在可能没有实际意义,并且基于对问题中有限信息的猜测而言。

虽然内核可能配置为支持750MB,但这将是可用的总内存。其中一些将被操作系统映像使用,虽然我们不会期望太多,我们可以假设至少700MB应该可用。

将使用一些额外的内存为每个任务提供堆栈 - 与taskSpawn中指定的应用程序相关的多少。您可以检查这一点,但同样,不太可能产生重大影响。

让我们慷慨,并假设你真的只有650MB。从理论上讲,这应该是充足的。

然而我们有这个错误:

memPartAlloc: block too big 15912260 bytes (0x10 aligned) in partition 0xe004608

会发生什么?这意味着什么? 此错误告诉您内存分配器无法分配内存,因为请求太大。有趣的是,请求是15912260,这不是32MB,实际上是超过15MB的阴影。因此,值得检查一下您实际要求的内容。

其次,此错误消息来自memPartAlloc。您是否正在使用malloc()memPartAlloc()分配内存?区别很重要,因为malloc将从系统内存分区中分配内存,而memPartAlloc则从用户指定的和创建的分区中分配内存。

如果您正在使用memPartAlloc,请确保从正确的分区分配内存,并且已创建足够内存以满足请求。

修改

由于看起来这是一个RTP,您还应该确认RTP已分配足够大的堆。这是通过环境变量指定的,如answer所述。