- 论坛徽章:
- 0
|
回复 10# lli_njupt
:) 请教提不上,互相讨论吧...
使用ldrex和strex来保证原子操作的话在我的理解里应该是不需要关中断的,这个就是新的ldrex和strex来保证原子操作最强大的地方
一不会锁总线,二不需要关中断。
ldrex和strex之间会发生中断会发生中断,因为没关中断的话,中断在任何地方都会发生。但是ldrex和strex的这个操作序列保证了无论是否有中断产生,操作都是原子的。
原子操作包含4个步骤:
step 1.ldrex r0,[addr] ; 从addr中读取值,并借助monitor在对应的地址上做一个tag
step 2. some operation ;对读出的值做一些操作
step 3. strex r1,r0,[addr] ;将处理后的r0写回[addr],r1指示此次写操作是否成功,而此次写操作能够成功的一个条件是,在step 1的ldrex中标记的tag仍然存在
step 4. teq r1,#0;bne 1b ;如果step 3写失败,返回step 1.
而在linux中,在所有中断的入口都会调用clrex来清除掉monitor标记的这个tag
那么如果step 1和step 3之间有中断发生,在中断处理完成返回之后step 3会失败(因为step1中的tag已经被清除),然后又会进入step 1重新读[addr]中的值。
也就是无论如何都不会发生“交错读”这种现象。因为每次strex失败之后都会重新再读一次[addr]的值。
|
|