我对vxworks很新,我正在构建一个RTP应用程序,它需要动态分配一些内存。我已经为内核配置了750MB的内存。
我在程序的最开始分配块大小为32MB的块10个数字,但是在第5或第6个块分配之后,我在控制台上收到消息memPartAlloc: block too big 15912260 bytes (0x10 aligned) in partition 0xe004608
的分配失败。
当有足够的可用内存时,内存分配怎么会失败?我不认为在我的程序开始时内存已经碎片足以使分配失败,并且根据memShow()
的输出,确实有足够的可用内存来满足请求。
如果由于任何奇怪的原因确实存在碎片,有没有办法压缩可用空间并继续在Vxworks中?
答案 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所述。