realloc 覆盖变量(Zynq SoC (Cortex A9) 上的 Xilinx SDK)
realloc overwrite variable (Xilinx SDK on a Zynq SoC (Cortex A9))
如前所述,我有一个 Zynq SoC(ZC706 评估板),我正在尝试从 SD 卡读取图像。为此,我使用了 FatFs 库 (http://elm-chan.org/fsw/ff/00index_e.html)。
在我的代码中,我从文件中读取了 4096 字节并将其保存到缓冲区中。之后,我将缓冲区复制到一个 unsigned char 指针,每次读取操作后我都会增加该指针的大小。
然后我使用 realloc,copyU32ArrayToUnsignedCharArray 函数中的 for 循环 'failed' 因为大小变量被输出数组覆盖。
在 copyU32ArrayToUnsignedCharArray 函数中覆盖 "size" 的代码:
u32 buffer[1024];
unsigned char *img = NULL;
bytesreaded = 0;
for (;;) {
br=0;
fr = f_read(&fil, buffer, sizeof(buffer), &br); /* Read a chunk of source file */
if (fr || br == 0)
break; /* error or eof */
img = realloc(img,br);
copyU32ArrayToUnsignedCharArray(buffer, &img[bytesreaded], br/4); // /4 because u32(32 bit) in to unsigned char(8 bit)
bytesreaded += br; // update readed bytes
}
有效的代码:
u32 buffer[1024];
unsigned char *img = NULL;
img = malloc(512*512*3+100);
bytesreaded = 0;
for (;;) {
br=0;
fr = f_read(&fil, buffer, sizeof(buffer), &br); /* Read a chunk of source file */
if (fr || br == 0)
break; /* error or eof */
copyU32ArrayToUnsignedCharArray(buffer, &img[bytesreaded], br/4); // /4 because u32(32 bit) in to unsigned char(8 bit)
bytesreaded += br; // update readed bytes
}
copyU32ArrayToUnsignedCharArray函数:
void copyU32ArrayToUnsignedCharArray(u32 *in, unsigned char* out, uint size){
int i,x;
x = 0;
for (i = 0; i < size; i++) {
if(size != 1024)
break;
in[i] = Xil_In32BE(&in[i]);
out[x] = (u32) in[i] >> 24;
out[x + 1] = (u32) in[i] >> 16 & 0x00FF;
out[x + 2] = (u32) in[i] >> 8 & 0x0000FF;
out[x + 3] = (u32) in[i] & 0x000000FF;
x += 4;
}
}
我想使用realloc,因为我不知道我读取的图像有多大。
更新:
有关不起作用的代码的一些进一步信息。我调试了它,指向 *img 的指针不为空,所以 realloc 成功了。如果我使用 gdb,copyU32ArrayToUnsignedCharArray 函数中会发生以下情况:
- 指向变量 "out" 的指针是 0x001125a8
- "size" 变量的地址是 0x0011309c(存储在这个位置的值是正确的)
- 这两个变量之间内存中的 space 是 0xaf4 = 2804 dec(两个地址的差异)
- 如果 copyU32ArrayToUnsignedCharArray 函数中的 for 循环达到 i=702 和 x=2808,则大小变量更改为另一个值
此致,
阿诺
我用Notlikethat的提示解决了这个问题。问题是小堆大小。增加堆是通过编辑链接描述文件
完成的
如前所述,我有一个 Zynq SoC(ZC706 评估板),我正在尝试从 SD 卡读取图像。为此,我使用了 FatFs 库 (http://elm-chan.org/fsw/ff/00index_e.html)。 在我的代码中,我从文件中读取了 4096 字节并将其保存到缓冲区中。之后,我将缓冲区复制到一个 unsigned char 指针,每次读取操作后我都会增加该指针的大小。
然后我使用 realloc,copyU32ArrayToUnsignedCharArray 函数中的 for 循环 'failed' 因为大小变量被输出数组覆盖。
在 copyU32ArrayToUnsignedCharArray 函数中覆盖 "size" 的代码:
u32 buffer[1024];
unsigned char *img = NULL;
bytesreaded = 0;
for (;;) {
br=0;
fr = f_read(&fil, buffer, sizeof(buffer), &br); /* Read a chunk of source file */
if (fr || br == 0)
break; /* error or eof */
img = realloc(img,br);
copyU32ArrayToUnsignedCharArray(buffer, &img[bytesreaded], br/4); // /4 because u32(32 bit) in to unsigned char(8 bit)
bytesreaded += br; // update readed bytes
}
有效的代码:
u32 buffer[1024];
unsigned char *img = NULL;
img = malloc(512*512*3+100);
bytesreaded = 0;
for (;;) {
br=0;
fr = f_read(&fil, buffer, sizeof(buffer), &br); /* Read a chunk of source file */
if (fr || br == 0)
break; /* error or eof */
copyU32ArrayToUnsignedCharArray(buffer, &img[bytesreaded], br/4); // /4 because u32(32 bit) in to unsigned char(8 bit)
bytesreaded += br; // update readed bytes
}
copyU32ArrayToUnsignedCharArray函数:
void copyU32ArrayToUnsignedCharArray(u32 *in, unsigned char* out, uint size){
int i,x;
x = 0;
for (i = 0; i < size; i++) {
if(size != 1024)
break;
in[i] = Xil_In32BE(&in[i]);
out[x] = (u32) in[i] >> 24;
out[x + 1] = (u32) in[i] >> 16 & 0x00FF;
out[x + 2] = (u32) in[i] >> 8 & 0x0000FF;
out[x + 3] = (u32) in[i] & 0x000000FF;
x += 4;
}
}
我想使用realloc,因为我不知道我读取的图像有多大。
更新:
有关不起作用的代码的一些进一步信息。我调试了它,指向 *img 的指针不为空,所以 realloc 成功了。如果我使用 gdb,copyU32ArrayToUnsignedCharArray 函数中会发生以下情况:
- 指向变量 "out" 的指针是 0x001125a8
- "size" 变量的地址是 0x0011309c(存储在这个位置的值是正确的)
- 这两个变量之间内存中的 space 是 0xaf4 = 2804 dec(两个地址的差异)
- 如果 copyU32ArrayToUnsignedCharArray 函数中的 for 循环达到 i=702 和 x=2808,则大小变量更改为另一个值
此致,
阿诺
我用Notlikethat的提示解决了这个问题。问题是小堆大小。增加堆是通过编辑链接描述文件
完成的