我的程序里面有两个大小一样的结构体数组A和B(比较大),初始化的时候要用memcpy复制到另外的结构体全局变量(C 和 D)中,复制之前会使用malloc分配空间。
给第一个全局变量C使用malloc分配大小为A的空间的时候,返回值为esysmem内地址c002
但是给第二个全局变量D使用malloc分配大小为B的空间时,返回值为0.
我的stack分配如下:
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
.stack : > RAMM1 PAGE = 1
我的esysmem分配如下:
RAMGS4_5_6 : origin = 0x010000, length = 0x003000
.esysmem : > RAMGS4_5_6 PAGE = 1
我的cint分配如下:
FLASHB : origin = 0x082000, length = 0x008000
.cinit : > FLASHB PAGE = 0, ALIGN(4)
———————- ——– ——— ——– ——– —- ——–
BOOT_RSVD 00000002 00000120 00000000 00000120 RWIX
RAMM1 00000400 00000400 00000300 00000100 RWIX
片内空间还是比较充足的,malloc失败除了空间不够之外还有什么原因?
Green Deng:变量的话考虑是ram空间分配不足,有试过加大ram空间吗
我的程序里面有两个大小一样的结构体数组A和B(比较大),初始化的时候要用memcpy复制到另外的结构体全局变量(C 和 D)中,复制之前会使用malloc分配空间。
给第一个全局变量C使用malloc分配大小为A的空间的时候,返回值为esysmem内地址c002
但是给第二个全局变量D使用malloc分配大小为B的空间时,返回值为0.
我的stack分配如下:
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
.stack : > RAMM1 PAGE = 1
我的esysmem分配如下:
RAMGS4_5_6 : origin = 0x010000, length = 0x003000
.esysmem : > RAMGS4_5_6 PAGE = 1
我的cint分配如下:
FLASHB : origin = 0x082000, length = 0x008000
.cinit : > FLASHB PAGE = 0, ALIGN(4)
———————- ——– ——— ——– ——– —- ——–
BOOT_RSVD 00000002 00000120 00000000 00000120 RWIX
RAMM1 00000400 00000400 00000300 00000100 RWIX
片内空间还是比较充足的,malloc失败除了空间不够之外还有什么原因?
orient:
回复 Green Deng:
增加过esysmem的空间, 没效果。 跟stack的空间有关吗?目前stack有0x400, 可以继续增加么?
我的程序里面有两个大小一样的结构体数组A和B(比较大),初始化的时候要用memcpy复制到另外的结构体全局变量(C 和 D)中,复制之前会使用malloc分配空间。
给第一个全局变量C使用malloc分配大小为A的空间的时候,返回值为esysmem内地址c002
但是给第二个全局变量D使用malloc分配大小为B的空间时,返回值为0.
我的stack分配如下:
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
.stack : > RAMM1 PAGE = 1
我的esysmem分配如下:
RAMGS4_5_6 : origin = 0x010000, length = 0x003000
.esysmem : > RAMGS4_5_6 PAGE = 1
我的cint分配如下:
FLASHB : origin = 0x082000, length = 0x008000
.cinit : > FLASHB PAGE = 0, ALIGN(4)
———————- ——– ——— ——– ——– —- ——–
BOOT_RSVD 00000002 00000120 00000000 00000120 RWIX
RAMM1 00000400 00000400 00000300 00000100 RWIX
片内空间还是比较充足的,malloc失败除了空间不够之外还有什么原因?
Green Deng:
回复 orient:
.stack可以增加的
“返回值为0”时,CCS有报什么错吗?
我的程序里面有两个大小一样的结构体数组A和B(比较大),初始化的时候要用memcpy复制到另外的结构体全局变量(C 和 D)中,复制之前会使用malloc分配空间。
给第一个全局变量C使用malloc分配大小为A的空间的时候,返回值为esysmem内地址c002
但是给第二个全局变量D使用malloc分配大小为B的空间时,返回值为0.
我的stack分配如下:
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
.stack : > RAMM1 PAGE = 1
我的esysmem分配如下:
RAMGS4_5_6 : origin = 0x010000, length = 0x003000
.esysmem : > RAMGS4_5_6 PAGE = 1
我的cint分配如下:
FLASHB : origin = 0x082000, length = 0x008000
.cinit : > FLASHB PAGE = 0, ALIGN(4)
———————- ——– ——— ——– ——– —- ——–
BOOT_RSVD 00000002 00000120 00000000 00000120 RWIX
RAMM1 00000400 00000400 00000300 00000100 RWIX
片内空间还是比较充足的,malloc失败除了空间不够之外还有什么原因?
orient:
回复 Green Deng:
编译时没有报错,但接下来执行memcpy的时候会触发ITRAP。原来的stack分配在RAMM1,还差100就满了,后来我把stack分配到GS7 RAM,但是这样导致HW_Init();执行失败, PC指向了0,再把stack分配给RAMD1, 它的空间时RAMM1的两倍, malloc给D返回的地址还是0。但是这次执行memcpy的时候没有触发ITRAP
我的程序里面有两个大小一样的结构体数组A和B(比较大),初始化的时候要用memcpy复制到另外的结构体全局变量(C 和 D)中,复制之前会使用malloc分配空间。
给第一个全局变量C使用malloc分配大小为A的空间的时候,返回值为esysmem内地址c002
但是给第二个全局变量D使用malloc分配大小为B的空间时,返回值为0.
我的stack分配如下:
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
.stack : > RAMM1 PAGE = 1
我的esysmem分配如下:
RAMGS4_5_6 : origin = 0x010000, length = 0x003000
.esysmem : > RAMGS4_5_6 PAGE = 1
我的cint分配如下:
FLASHB : origin = 0x082000, length = 0x008000
.cinit : > FLASHB PAGE = 0, ALIGN(4)
———————- ——– ——— ——– ——– —- ——–
BOOT_RSVD 00000002 00000120 00000000 00000120 RWIX
RAMM1 00000400 00000400 00000300 00000100 RWIX
片内空间还是比较充足的,malloc失败除了空间不够之外还有什么原因?
Green Deng:
回复 orient:
还有一种可能,在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏。下次再使用malloc()函数申请内存就会失败,返回空指针NULL(0)。你可以从不能分配的那个malloc()函数开始,往回找地址最近的那个能分配的malloc()函数,出问题的代码应该就在这部分,很可能的原因就是指针越界,对未知的内存进行了操作,导致了malloc()不能继续分配内存。
我的程序里面有两个大小一样的结构体数组A和B(比较大),初始化的时候要用memcpy复制到另外的结构体全局变量(C 和 D)中,复制之前会使用malloc分配空间。
给第一个全局变量C使用malloc分配大小为A的空间的时候,返回值为esysmem内地址c002
但是给第二个全局变量D使用malloc分配大小为B的空间时,返回值为0.
我的stack分配如下:
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
.stack : > RAMM1 PAGE = 1
我的esysmem分配如下:
RAMGS4_5_6 : origin = 0x010000, length = 0x003000
.esysmem : > RAMGS4_5_6 PAGE = 1
我的cint分配如下:
FLASHB : origin = 0x082000, length = 0x008000
.cinit : > FLASHB PAGE = 0, ALIGN(4)
———————- ——– ——— ——– ——– —- ——–
BOOT_RSVD 00000002 00000120 00000000 00000120 RWIX
RAMM1 00000400 00000400 00000300 00000100 RWIX
片内空间还是比较充足的,malloc失败除了空间不够之外还有什么原因?
orient:
回复 Green Deng:
不使用这个方法了,不过还是谢谢回答。