XIo的实现原理

 在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操作可以实时的进行。

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值