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