下面的汇编代码是通过SWP实现互斥的例子
EXPORT lock_mutex_swp
lock_mutex_swp PROC
LDR r2, =locked
SWP r1, r2, ; Swap R2 with location , value placed in R1
CMP r1, r2 ; Check if memory value was ‘locked’
BEQ lock_mutex_swp ; If so, retry immediately
BX lr ; If not, lock successful, return
ENDP
EXPORT unlock_mutex_swp
unlock_mutex_swp
LDR r1, =unlocked
STR r1, ; Write value ‘unlocked’ to location
BX lr
ENDP
当然,除了上面的情况,还可能由于中断的产生导致读和写的操作被打断。在一些任务比较简单的系统中,可以在关键的代码中利用禁止中断的方式来保证对数据操作的原子性,然而对于现在复杂的多任务操作系统,禁止中断的做法显然不是有效的解决方法。所以SWP通过特殊的访问方式,不需要禁止中断,但是这样也会延长中断的响应时间。随着处理器的快速发展,多核处理器已经显示出了强大的优势,同步的问题显得更加明显。如下所示,一个系统由一个Cortex-A8和Cortex-M4组成,他们都会访问一同一段存储空间。
下面的汇编代码是通过SWP实现互斥的例子
EXPORT lock_mutex_swp
lock_mutex_swp PROC
LDR r2, =locked
SWP r1, r2, ; Swap R2 with location , value placed in R1
CMP r1, r2 ; Check if memory value was ‘locked’
BEQ lock_mutex_swp ; If so, retry immediately
BX lr ; If not, lock successful, return
ENDP
EXPORT unlock_mutex_swp
unlock_mutex_swp
LDR r1, =unlocked
STR r1, ; Write value ‘unlocked’ to location
BX lr
ENDP
当然,除了上面的情况,还可能由于中断的产生导致读和写的操作被打断。在一些任务比较简单的系统中,可以在关键的代码中利用禁止中断的方式来保证对数据操作的原子性,然而对于现在复杂的多任务操作系统,禁止中断的做法显然不是有效的解决方法。所以SWP通过特殊的访问方式,不需要禁止中断,但是这样也会延长中断的响应时间。随着处理器的快速发展,多核处理器已经显示出了强大的优势,同步的问题显得更加明显。如下所示,一个系统由一个Cortex-A8和Cortex-M4组成,他们都会访问一同一段存储空间。