Flash操作 原子写 非原子写
原子和非原子操作
读、修改、写操作
对一个变量 A 1或上0x01,C语言写法:
A 1|= 0x01;
通过编译转成汇编后:
LOAD R1,[#A 1] ; Read a value from A 1 into R1
MOVE R2,#0x01 ; Move the absolute constant 1 into R2
OR R1,R2 ; Bitwise OR R1 (A 1) with R2 (constant 1)
STORE R1,[#A 1 ]; Store the new value back to A 1
第1句,从A 1的地址读取数据,保存到R1;(读操作)
第2句,把0x01保存到R2;(读操作)
第3句,R1和R2进行或操作,并存入R1;(修改操作)
第4句,把R1的值保存到A 1的地址去。(写操作)
这就叫非原子操作,因为他使用了超过一条的汇编指令,并且可以被中断(相反,只用到一条指令的,无法中断的称作原子操作)。更新一个结构体的多个成员,或者更新一个大于CPU结构的字长(例如,在16位机器上更新一个32位变量)的变量,都是非原子操作的例子。如果中断,可能会导致数据丢失或损坏。