即使有足够的内存,Vxworks 内存分配失败
Vxworks memory allocation failure even though there is enough memory
我是 vxworks 的新手,我正在构建一个 RTP 应用程序,它需要动态分配一些内存。我已将内核配置为 750MB 的内存大小。
我在程序的最开始以 10 个数字块的形式分配内存,每个数字大小为 32MB,但是在第 5 或第 6 个块分配之后,我在控制台上收到分配失败消息 memPartAlloc: block too big 15912260 bytes (0x10 aligned) in partition 0xe004608
。
当有足够的可用内存时,内存分配怎么会失败?我不认为内存碎片化到足以让分配在我的程序开始时失败,并且根据 memShow()
的输出,确实有足够的可用内存来满足请求。
如果内存确实由于任何奇怪的原因而碎片化,是否有一些方法可以压缩空闲 space 并在 Vxworks 中继续?
这是一个老问题,所以这个答案现在可能没有实际意义,并且在一定程度上是基于问题中有限信息的推测。
虽然内核可能配置为支持 750MB,但这将是可用的总内存。其中一些将由 OS 图像使用,尽管我们不会期望太多,并且我们可以假设至少 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 所述。
我是 vxworks 的新手,我正在构建一个 RTP 应用程序,它需要动态分配一些内存。我已将内核配置为 750MB 的内存大小。
我在程序的最开始以 10 个数字块的形式分配内存,每个数字大小为 32MB,但是在第 5 或第 6 个块分配之后,我在控制台上收到分配失败消息 memPartAlloc: block too big 15912260 bytes (0x10 aligned) in partition 0xe004608
。
当有足够的可用内存时,内存分配怎么会失败?我不认为内存碎片化到足以让分配在我的程序开始时失败,并且根据 memShow()
的输出,确实有足够的可用内存来满足请求。
如果内存确实由于任何奇怪的原因而碎片化,是否有一些方法可以压缩空闲 space 并在 Vxworks 中继续?
这是一个老问题,所以这个答案现在可能没有实际意义,并且在一定程度上是基于问题中有限信息的推测。
虽然内核可能配置为支持 750MB,但这将是可用的总内存。其中一些将由 OS 图像使用,尽管我们不会期望太多,并且我们可以假设至少 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 所述。