Q1 #define barrier() __asm__ __volatile__("": : :"memory")宏的作用?
A:这个宏定义于blob-2.0.5-pre2/include/blob/util.h中,在blob-2.0.5-pre2/src/blob/intel16.c中多次用到。经过Oldlinux.org论坛中的高人指点,我在ULK2的5.3.2节中找到了对这个宏的解释:The macro, however, forbids the complier to reshuffle the instructions.即该宏禁止了编译器对(汇编语言)指令的重新排列。当使用带优化功能的编译器时,你不能指望指令会严格按照它们在源程序中出现的顺序来执行。例如,编译器可能会为了优化CPU中寄存器的使用而重新排列(reorder)汇编语言指令,这将大大提高程序的运行速度。
然而当面对同步问题时,则需要避免指令的重新排序。此时需要使用存储器屏障原语(memory barrier premitive)来保证位于该原语之前的指令在位于该原语之后的指令开始执行之前执行完毕。
而对28F320C3 Flash存储器的正确访问是依赖于发送到CUI的命令代码序列的先后次序(时序)正确,因此需要使用存储器屏障原语,而barrier()宏正是存储器屏障原语的具体实现。
汇编语言指令真的会被有优化功能的编译器重新排序吗?不妨来测试一下。
以flash.c文件中的读取28F320C3 Flash的Device Identification Code的函数read_device_id为例
u16 read_device_id(u32 *blockstart)
{
u16 *p = (u16 *)blockstart;
u16 resul

本文详细解释了在访问28F320C3 Flash存储器时,为何需要使用内存屏障原语`barrier()`宏,以及通过实例展示了汇编指令在有无`barrier()`时的编译器优化差异,强调了在特定时序要求下防止指令重排序的重要性。
2534

被折叠的 条评论
为什么被折叠?



