2014-04-24 3 views
0

철저하게 처리 할 수없는 처리를 위해 배열간에 데이터를 전달하는 데 문제가 있습니다. (Nios II 프로세서에서 코드를 실행 중입니다.)배열 데이터 처리

HAL 타입 정의 : alt_u8 : 부호없는 8 비트 정수. alt_u32 : 부호없는 32 비트 정수.

내 FPGA의 코어는 데이터 처리를 위해 한 번에 128 비트를 사용합니다. 이 데이터

alt_u32 load[4] = {0x10101010, 0x10101010, 0x10101010, 0x10101010}; 

함수 과정을 그리고 내가 정보를 검색하는 다른 배열을 사용 :이 함수에 4 × 32 비트 부호없는 INT를 전달하여 내 원래의 코드에서 일하고있다.

data_setload(&context,&load);  //load data 
data_process(&context);     //process 
memcpy(resultdata,context.result,4*sizeof(unsigned int)); 
for(i=0; i<4 ; i++){  
    printf("received 0x%X \n",resultdata[i]);  //print to screen 
} 

위의 코드는 완벽하게 작동하지만 두 번째 부분과 결합하면 작동하지 않습니다.

데이터 저장에 버퍼가 있습니다. alt_u8 rbuf [512];

데이터 버퍼가 가득 차면 'rbuf'의 내용을 'load'배열로 전송하려고합니다. 가장 큰 문제는 load [4]가 처리를 위해 4 x 32 비트 부호없는 int를 사용한다는 것입니다. 그래서이 4 개를 32 비트 부호없는 정수로 rbuf의 데이터로 '채우고'데이터를 처리하고 결과를 배열에 저장하려고합니다. 그런 다음 다시 반복하고 배열 load [4]를 다음 데이터 집합 (rbuf)으로 채우고 rbuf가 비어있을 때까지 계속합니다. 8 비트가 Array_B [4] 부호없는 32 비트 >>을 Array_B [4 과정에 복사 부호의

Array_A (패드 제로 필요하다면)

alt_u8 rbuf[512]; 
alt_u8 store[512]; 
alt_u32 resultdata[512]; 
alt_u32 *reg;     
int d, k, j; 

for (j=0; j<512; j++){ 
    read_byte(&ch); //gets data 
    rbuf[j]=ch;  //stores to array rbuf 
} 
printf(" rbuf is full \n"); 
memcpy(store,rbuf,512*sizeof(alt_u8)); //store gets the value in rbuf. 

for(k=0;k<16;k++) //for loop used take in 4 chars to one unsigned 32 bit int 
{ 
    for(d=0;d<4;d++) //store 4 chars into an one 32 bit unsigned int 
    { 
     *reg = (*reg<<8 | store[d]) ; 
    } 
    reg =+1;  //increment pointer to next address location(not working properly) 
}   //loop back 

reg = 0;  //set pointer address back to 0 

for(j=0;j<16;j++) //trying to process data from here 
{ 
    memcpy(load,reg,4*sizeof(alt_u32));  //copy first 4 locations from 'reg' to 'load' 
    data_setload(&context,&load);  //pass 'load' to function 
    data_process(&context);      //process 128 bits 
    memcpy(resultdata,context.result,4*sizeof(alt_u32)); //results copied to 'resultdata' 
    *reg = *reg + 4;   //increment pointer address by 4? 
    *resultdata = *resultdata+4;  //increment resultdata address by 4 and loop again 
}   
/** need to put data back in char form for displaying***/ 

for(k=0;k<16;k++)    //for loop used take chars from 32 unsigned int 
{ 
    for(d=4;d>=0;d--)   //loads 4 chars FROM A 32 unsigned int 
    { 
     store[d] = *resultdata; 
     *resultdata = *resultdata>>8; 
    } 
    resultdata =+1; //increment pointer next address location 
} 
for(d=0; d<512 ; d++){ 
    printf("received 0x%X ",store[d]); 

최종 목표 걸릴 것입니다 ] 내 HDL 코드. 입력이 128 비트가되어야합니다. 그런 다음 루프 백하고 다음 128 비트를 가져 와서 처리합니다.

+0

이 잘못 C#을이에 와서 않는 경우 나, C 코드를 볼 – Gusman

+0

태그, C#을하지 않습니다 :

마지막으로, 여기에 최소 메모리 사용량과 최상의 성능과 전체 rewriten 기능은 무엇입니까? – crashmstr

+0

변경됨 ... 사과 –

답변

0

reg가 정의되었지만 초기화되지 않았으므로 널 포인터가되고 값을 쓰려고 삼가고 있습니다 (* reg는 값을 할당하고 reg는 주소를 할당합니다).

또한 k-d 루프가 잘못되었습니다. 당신이 등록 올바르게 초기화있어 경우, 해당 작업을 수행하는 다음 정말 쉬운 방법은 다음과 같습니다

for(k=0;k<16;k += 4)    //for loop used take chars from 32 unsigned int 
{ 
    *rbuf = *((alt_u32*)&store[k]); 
    rbuf++; 
} 

그 루프가 그들 rbuf가 가리키는 곳에 저장 및 복사의 시작 바이트로 저장 네 intengers를 취할 것입니다.

나는 거의 당신이 달성하기를 원하는 것이 아니지만 코드가하려고했던 것입니다.

for(k=0;k<512;k += 4)    //for loop used take chars from 32 unsigned int 
{ 
    *rbuf = *((alt_u32*)&store[k]); 
    rbuf++; 
} 

rbuf하는 상점에 저장된 모든 값을 복사합니다 : 당신은 완전히 rbuf 점은 당신이 할 수있는 위치에 저장소를 복사합니다.또한

, 더 나은, 더 빠르게, 더 깨끗한 방법 : 그냥 처음 네 개의 정수로 부하를 입력 할 경우 마지막으로

memcpy(rbuf, &store, 512); 
rbuf += 512/sizeof(alt_u32); 

, 당신은이 작업을 수행 할 수 있습니다

for(k = 0; k < 4; k++) 
{ 
    load[k] = *((alt_u32*)&rbuf[k * 4]); 
} 

또는

memcpy(&load, &rbuf, 4 * sizeof(alt_u32)); 

당신은 주목할만한 상점이 필요하지 않습니다.

alt_u8 rbuf[512]; 
alt_u32 resultdata[128]; //fixed its size to 128, (512/sizeof(alt_u32)) 

int j; 

//Do the loop to load data in rbuf 
for (j=0; j<512; j++) 
    read_byte(&rbuf[j]); 

printf(" rbuf is full \n"); 

//Loop through rbuf in 4 * 32 bits per iteration (4*4 bytes) 
for(j = 0; j < 512; j+= sizeof(alt_u32) * 4) 
{ 

    data_setload(&context, (alt_u32*)&rbuf[j]); //I assume this function expects an alt_u32 pointer to 4 alt_u32 values 
    data_process(&context); 
    memcpy(&resultdata[j/sizeof(alt_u32)], context.result, sizeof(alt_u32) * 4);//I assume context.result is a pointer, if not then add & before it 

} 

//Print received data 
for(j=0; j<512 ; j++){ 
    printf("received 0x%X ",rbuf[d]); 
+0

10 분을 주며 가장 쉬운 코드로 새로운 응답을 추가합니다. – Gusman

+0

그래도 문제가 발생하는 경우 자세한 답변을 보내 주셔서 감사합니다. 위의 단어 저장소와 변수 'store'가 약간 위에 표시되지 않을 수 있습니다. 지금은 전체 배열이 있습니다. 'alt_u8 rbuf [512];' 'alt_u32 load [4];' 128 비트가로드 된 후 'rbuf'에서 다음 128 비트를 가져 와서 'load'로 옮깁니다. '를 다시 입력하고 dataprocess(); 기능이 완료되었습니다. 다른 쪽은 dataprocess()입니다. 배열은'ult_u32 result [4]; 배열을 사용하여 128 비트를 출력합니다. -data는'alt_u8'로 되돌아 가야합니다. –

+0

좋아요, 응답 부분을 편집해야합니다. 결과 부분은 새 것이고, 내놔주세요. – Gusman