Intel TE28F320C3BA100 Flash读写函数FAQ

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值