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操作可以實時的進行。
?
?
總結
- 上一篇: php网页无法显示图片,XP系统中,网页
- 下一篇: 什么是STAR法则