2013-11-14 3 views
1

Я читаю с 16-разрядного адреса памяти на 32-битном процессоре. По какой-то причине я не получаю ожидаемого результата. Содержание адреса представляет собой 32-байтовое слово.C бит бит беспорядок

ABCDEFABCDEFABCDABCDEFABCDEFABCD 

код Я использую это:

u8 SendBuffer[128]; 
    u8 ReceiveBuffer[128]; 
    uint32_t InRAM1; 
    int btidx=0; 
    int tsize=32; 
    for (Index = 0; Index <tsize; Index++) { 
    int sbit=btidx*sizeof(uint32_t); 
    InRAM1 = XIo_In32(RAM1_ADDR+sbit); 
    u8 *v1=(u8 *)&XIo_In32(RAM1_ADDR+sbit); 
    SendBuffer[Index] = v1[Index]; 
    SendBuffer[Index+1] = v1[Index+1]; 
    ReceiveBuffer[Index] = 0; 
    ReceiveBuffer[Index+1] = 0;  
    xil_printf("Data: %c%c %c%c \n\r", 
       (InRAM1 &0xff), (InRAM1 >>8)&0xff, 
       SendBuffer[Index], SendBuffer[Index+1]); 
    btidx++; 
    Index++; 
    } 

Результат после запуска заключается в следующем. Я разбиваю голову, пытаясь решить эту проблему. Что я делаю неправильно в этом? Спасибо за любую помощь.

Data: AB AB 
Data: CD 
Data: EF AB 
Data: AB 
Data: CD AB 
Data: EF 
Data: AB CD 
Data: CD 
Data: AB CD 
Data: CD 
Data: EF CD 
Data: AB 
Data: CD 
Data: EF 
Data: AB 
Data: CD 
+0

Вы не должны просто использовать 'XIo_In16()' читать 16 битную память вместо того, чтобы разрушить абстракцию 'xio.h'? –

+0

Несомненно. Я мог бы это сделать, но это не решает проблему, это определенно делает ее опрятной ... – chickegg

+0

Решает проблему, если вы просто используете значение, возвращаемое функцией/макросом XIo, вместо того, чтобы получать необработанный указатель на память на что он возвращается (что, кстати, работает только потому, что API-интерфейсы XIo_InXx() 'реализованы как макросы, которые делают магию указателей и не реализованы как функции). Ваш код уже получает каждый байт данных в 16-разрядной памяти с помощью переменной InRAM1. Почему бы просто не использовать этот метод (с небольшим изменением присвоения значения InRAM1 с помощью API-интерфейса XIo_In16() вместо ' XIo_In32() 'для доступа к 16-разрядной памяти соответственно)? –

ответ

2

Вам нужно изменить:

SendBuffer[Index] = v1[0]; 
SendBuffer[Index+1] = v1[1]; 

Index будет держать приращением и пропустить биты ...

+0

Да, это работает ... Большое спасибо ... – chickegg