Я пытаюсь записать число с двойной подписью в память и прочитать то же самое, чтение излишне, поскольку оно просто проверяет, есть ли в памяти правильные данные, прежде чем я запускаю матрицу PL (программируемая логика) FPGA дляполучить доступ к этим данным и выполнить задачу.
Я читаю файл в double (часть объединения) и затем записываю в память через unsigned long (часть объединения).Но данные до записи в память и после того, как я их прочитал, неверны, это всего лишь последний байт.(подробности см. в коде и комментариях)
union floatpun {
double dw;
unsigned long lw;
};
void *lookup_slave_by_phy_addr(const int fd, const off_t target, const size_t mapsize)
{
void *map_base, *virt_addr;
/* Map one page */
map_base = mmap(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~(mapsize-1));
if (map_base == (void *) -1) { FATAL; }
printf("Memory mapped at address %p.\n", map_base);
fflush(stdout);
virt_addr = map_base + (target & (mapsize-1));
return virt_addr;
}
int main(int argc, char *argv[])
{
union floatpun conv;
FILE *fp;
fp = fopen("/media/card/numbers.txt", "r");
fscanf(fp,"%lf",&conv.dw); // 0.009101592004299160 Reads this number from the file, which is correct as expected.
printf("The value Read from the File is %lx \n",conv.lw); // Prints 3f 82 a3 da ff ff ff fe, which is also correct.
fclose(fp);
int fd;
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { FATAL; }
printf("/dev/mem opened.\n");
fflush(stdout);
void *weights;
// Map systemMemory master phy address range 0000 0008 7000 0000 -> 0000 0008 7FFF FFFF
weights = lookup_slave_by_phy_addr(fd,strtoul("0x0000000870000000",0,0),MAP_SIZE_256M);
*((unsigned char *) (weights+0x00)) = conv.lw; // Writing into the mempory
SysMem= *((unsigned char *) (weights+0x00)); // Reading it out from the memory
printf("Read %lx\n", SysMem); // When this is printed I get only FE, the last byte of the data read from the file, I have read the following 0x01, 02 03 also, which are all junk data like 0x69 0x95 0x9A
close(fd);
return 0;
}
Какую ошибку я делаю при записи в память или чтении из памяти, я хочу, чтобы эта полная 64-битная запись была записана в память.Или я должен вручную записать каждый байт в байт памяти, не адресуется ли слово памяти (32 бита)?или, если нет, могу ли я сделать это слово адресуемым?
Кроме того, это делается на Zynq с Petalinux
Пожалуйста, помогите:)