SDK 的"xil_io.h"中提供了对地址的直接读写操作
不过我在实践中发现,对于Xil_In32(),当偏移为1不断读取时,会出现不正确的值。
我当时是在某连续若干地址中写了 0x0000 00ff(假如基址是0xc000 0000吧),但是读取的时候
0xc000 0001 读取的值是 0x0000 00ff;
0xc000 0002 读取的值也是 0x0000 00ff;
我就很纳闷了,这不科学啊,如果Xil_In32()是读取4个Bytes,那么0xc000 0002 读取的值应该是 0x0000 ff00;
后来我就怀疑是不是因为内存对齐导致的,我做了一个尝试,代码如下
Addr = 0xc5000000; u32 offset = 0; for(offset = 0; offset < VERT * HORI; ) { Xil_Out32LE(Addr+4*offset, 0x00abcdef); Xil_Out32LE(Addr+4*offset+4, 0x00123456); offset+=2; } u32 value; for(offset = 0; offset < 160; offset++) { value = Xil_In8(Addr+offset); printf("Mem 0x%x is 0x%x \r\n",Addr+offset,value); } for(offset = 0; offset < 160; offset++) { value = Xil_In32(Addr+offset); printf("Mem 0x%x is 0x%x \r\n",Addr+offset,value); }
最终输出结果如下


Mem 0xc5000000 is 0xef Mem 0xc5000001 is 0xcd Mem 0xc5000002 is 0xab Mem 0xc5000003 is 0x0 Mem 0xc5000004 is 0xef Mem 0xc5000005 is 0xcd Mem 0xc5000006 is 0xab Mem 0xc5000007 is 0x0 Mem 0xc5000008 is 0xef Mem 0xc5000009 is 0xcd Mem 0xc500000a is 0xab Mem 0xc500000b is 0x0 Mem 0xc500000c is 0xef Mem 0xc500000d is 0xcd Mem 0xc500000e is 0xab Mem 0xc500000f is 0x0 Mem 0xc5000010 is 0xef Mem 0xc5000011 is 0xcd Mem 0xc5000012 is 0xab Mem 0xc5000013 is 0x0 Mem 0xc5000014 is 0xef Mem 0xc5000015 is 0xcd Mem 0xc5000016 is 0xab Mem 0xc5000017 is 0x0 Mem 0xc5000018 is 0xef Mem 0xc5000019 is 0xcd Mem 0xc500001a is 0xab Mem 0xc500001b is 0x0 Mem 0xc500001c is 0xef Mem 0xc500001d is 0xcd Mem 0xc500001e is 0xab Mem 0xc500001f is 0x0 Mem 0xc5000020 is 0xef Mem 0xc5000021 is 0xcd Mem 0xc5000022 is 0xab Mem 0xc5000023 is 0x0 Mem 0xc5000024 is 0xef Mem 0xc5000025 is 0xcd Mem 0xc5000026 is 0xab Mem 0xc5000027 is 0x0 Mem 0xc5000028 is 0xef Mem 0xc5000029 is 0xcd Mem 0xc500002a is 0xab Mem 0xc500002b is 0x0 Mem 0xc500002c is 0xef Mem 0xc500002d is 0xcd Mem 0xc500002e is 0xab Mem 0xc500002f is 0x0 Mem 0xc5000030 is 0xef Mem 0xc5000031 is 0xcd Mem 0xc5000032 is 0xab Mem 0xc5000033 is 0x0 Mem 0xc5000034 is