[Freescale MPC]同步指令eieio、isync、sync简介

Freescale 的MPC系列提供同步指令eieio、isync、sync,以及lwarx(Load Word and Reserve Indexed) 、stwcx(Store Word Conditional Indexed)
更多信息最好参看指令手册

指令eieio为强制I/O操作顺序执行指令,将Load和Store分成2个集合,防止cpu乱序发射时不按照源代码指定的顺序执行IO指令。
复制代码
  1.     while(TDRE == 0)
  2.     TDR = char1;
  3.     asm("eieio");
  4.     while(TDRE == 0);
  5.     TDR = char2;


上例中I/O设备处于一个外部存储器空间,TDR为发送寄存器,TDRE为发送状态位。当TDRE为1时,表示发送寄存器为空,程序可以将参数写入发送寄存器,否则不允许发送。
这里需要依次将char1、 char2发送,如果不使用eieio强制I/O顺序,就可能因为 PowerPC的优化导致Load、Store顺序混乱导致程序错误。

isync为同步操作指令。isync在指令完成时,执行同步,在新的内容下重载指令队列。isync指令在内容发生变化时使用,如当允许指令缓存或在存取没有结束但执行同步时使用。
复制代码
  1. lis    r29,0x0200
  2. msptr    IC_CST,r29
  3. isync


在例子中,第一行和第二行允许指令缓存。此时,指令队列有多个指令,但都不在指令缓存里,因为之前指令缓存未打开。指令isync可以同步指令队列到缓存。


sync是强制同步指令,确保编译进程序的,在sync指令之前的所有指令都被执行完毕之后才继续执行后续指令。例如,要处理器进入低功耗模式前,应该先sync完成之前的所有指令。

原http://www.powerpcdev.net/read.php?tid=8

你可能感兴趣的:([Freescale MPC]同步指令eieio、isync、sync简介)