在IICEEPRO.c文件中发现:
old_reg = XIo_In32(adr);
XIo_Out32(adr, old_reg & 0xFFFFFFFC);
不知Xio_In32()和Xio_Out32()的实现机理,于是研究了一下。
在生成硬件的bitstream之后,需要选择Software菜单下的Generate Liberay and BSPs选项,它将生成一个目录ppc405_0,其中的/include目录中有一个文件xio.h,它实现了Xio_In32()和Xio_Out32()两个函数的功能。代码如下:
#define XIo_In32(InputPtr) (*(volatile Xuint32 *)(InputPtr)); SYNCHRONIZE_IO;
#define XIo_Out32(OutputPtr, Value) /
{ (*(volatile Xuint32 *)(OutputPtr) = Value); SYNCHRONIZE_IO; }
可以看出,Xio_In32()就是取数据,Xio_Out32()就是写数据到一个地址空间。volatile的意思简单讲就是指明它是外设地址,至于SYNCHRONIZE_IO宏的意义见下面的代码:
/* The following macro is specific to the GNU compiler and PowerPC family. It
* performs an EIEIO instruction such that I/O operations are synced correctly.
* This macro is not necessarily portable across compilers since it uses
* inline assembly.
*/
#if defined __GNUC__
# define SYNCHRONIZE_IO __asm__ volatile ("eieio")
#elif defined __DCC__
# define SYNCHRONIZE_IO __asm volatile(" eieio")
#else
# define SYNCHRONIZE_IO
#endif
上面的注释写的很清楚,主要是加了汇编语句eieio,使IO操作可以实时的进行。