2016-06-08 2 views
0

언급 한대로 저는 Zynq SoC (ZC706 평가 보드)를 가지고 있으며 SD 카드에서 이미지를 읽으려고합니다. 이렇게하려면 FatFs 라이브러리 (http://elm-chan.org/fsw/ff/00index_e.html)를 사용하고 있습니다. 내 코드에서 파일에서 4096 바이트를 읽고 버퍼에 저장합니다. 그 후 나는 모든 읽기 작업 후에 크기가 증가하는 부호없는 char 포인터에 버퍼를 복사합니다.realloc 변수를 덮어 씁니다. (Zynq SoC (Cortex A9)의 자일링스 SDK)

그렇다면 realloc을 사용하고 있습니다. copyU32ArrayToUnsignedCharArray 함수의 for 루프는 크기 변수가 out 배열에 의해 덮어 쓰기 때문에 'failed'함수입니다. copyU32ArrayToUnsignedCharArray 기능의 "크기"를 덮어

코드 : 일

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에 대한 포인터가 null이 아니므로 realloc이 성공적으로 수행되었습니다. gdb를 사용하는 경우 copyU32ArrayToUnsignedCharArray 함수에서 다음과 같은 일이 발생합니다.
- "out"변수에 대한 포인터가 0x001125a8입니다.
- "size"변수의 주소는 0x0011309c입니다 (이 위치에 저장된 값은 올바른지)
-이 두 변수 사이의 메모리 공간은 0xaf4 = 2804 dec (두 주소의 차이)입니다.
- copyU32ArrayToUnsignedCharArray 함수의 for 루프가 i = 702 및 x = 2808에 도달하면 크기 변수가 다른 값

감사합니다.
아르노

+0

_ "... '은 크기 변수가 출력 배열에 의해 덮어 쓰여졌 기 때문에 실패했습니다."- 어떻게 알 수 있습니까? 'size'는 결코 주소가 찍히지 않는 함수 인자이기 때문에 덮어 쓸 수있는 저장 공간을 필요로하지 않습니다. (실제로 함수는 레지스터에서 쉽게 할 수 있습니다.) (https://godbolt.org/g/ GVXUwS)). 또한 반환 값을 확인하지 않는다면'realloc()'자체가 실패하지 않는다는 것을 어떻게 알 수 있습니까? (또는 이것이 베어 메탈 환경 인 것처럼 보이면 단순히'return NULL;))? – Notlikethat

+0

응용 프로그램이 베어 메탈이라고 언급하는 것을 잊지 않습니다. 나는 gdb로 프로그램을 디버깅하고 메모리를 살펴 본다. 포인터의 주소는 0x1125a8이고 크기는 0x11309c입니다. 그래서 0xaf4에서이 사이에 공백이 있습니다. 크기 변수를 덮어 쓰면 변수 i는 701과 x 2804가됩니다. 십진수 2804를 16 진수로 변환하면 이전에 계산 한 차이가 나타납니다 (2804 = 0xaf4) – alpine

+0

의견이 완전히 명확하지 않습니다. 조금 더? 당신은'size' 매개 변수 주소가 c'opyU32ArrayToUnsignedCharArray' 실행의 어떤 지점에서 덮어 쓰여지고 있다고 말하고 있습니까? ... – LPs

답변

0

나는 Notlikethat에서 힌트로 문제를 해결했습니다. 문제는 작은 힙 크기입니다. 힙 증가는 링커 스크립트 파일을 편집하여 수행합니다.