ARM的SWP和LDREX STREX指令
来源:互联网 发布:南风正太捏脸数据 编辑:程序博客网 时间:2024/05/02 06:46
早期的ARM指令集(V6前)提供SWP指令,该指令可原子交换寄存器和内存数据,用于实现信号量操作。
如下面这个例子:
sem_wati:
MOV R1,#0
LDR R0,=SEM
SWP R1,R1,[R0] ;取出信号量,并设置其为0
CMP R1,#0 ;判断是否有信号
BEQ sem_wait ;若没有信号,则等待
SWP指令的缺点是会lock总线,影响系统性能。
新的ARM指令(V6、V7)采用LDREX和STREX指令替换了SWP指令,可以实现对共享内存的非阻塞同步。
LDREX <Rt>,[Rn]
STREX <Rd>,<Rt>,[Rn] ;STREX成功,Rd置0
新指令的例子:
lock_mutex
LDREX r1,[r0] ; 检查是否lock
CMP r1,#LOCK ; 和LOCK比较,LOCK是0
BEQ lock_mutex ; 相等说明被锁定,自旋
MOV r1,#LOCK ; 不相等,加锁
STREX r2,r1,[r0] ; 尝试将r1写入锁
CMP r2,#0x0 ; 判断是否加锁成功(可能出现竞争导致加锁失败)
BNE lock_mutex ; 如果不成功,从头判断
DMB ; 内存屏障保证前面操作成功
BX lr ; 返回
ulock_mutex
DMB ; 内存屏障,保证安全访问
MOV r1,#UNLOCKED ; 解锁
STR r1,[r0] ;
BX lr ;
LDREX和STREX是通过ARM内核的一个叫Exclusive Monitor的机制实现的,EM是一个状态机。
LDREX指令将Monitor置为Exclusive状态,STREX指令将Exclusive状态置回为Open状态,由此保证访问的唯一性。
但是在进程切换时,可能导致EM被打乱,因此需要执行CLREX指令,清除Exclusive Monitor。
Rockie Cheng
- ARM的SWP和LDREX STREX指令
- 原子操作的实现 ARM的SWP和LDREX STREX指令
- ARM平台下独占访问指令LDREX和STREX的原理与使用详解
- ARM平台下独占访问指令LDREX和STREX的原理与使用详解
- ARM平台下独占访问指令LDREX和STREX的原理与使用详解
- ARM命令LDREX和STREX实现spinlock
- LDREX 和 STREX
- arm架构的独占读写指令ldrex和strex的使用详解(原子操作和自旋锁实现的基本原理)
- 汇编中的LDREX 和 STREX
- LDREX and STREX
- LDREX and STREX
- ARM指令集—SWP指令
- 1.20.ARM汇编指令集8之存储器访问指令(LDM和STM & SWP)
- arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
- arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
- arm上ldrex和strexeq指令用来尝试获取独占内存权限和设置在独占权限时回写
- 嵌入式学习笔记--关于ARM中SWP指令的执行顺序问题【待验证】
- ARM指令和Thumb指令的区别
- 委中穴 --- 腰疼好疗效
- ExtJS 4.0 的改变--较为完整的介绍
- 老子双核的电脑为什么这么慢?
- 一个程序员应具备的东西
- ORM与JDBC
- ARM的SWP和LDREX STREX指令
- 有效的利用清晨时间
- RAID
- 几种特殊的生成树
- union体与大小端模式的探讨
- php生成流水号
- windows phone (25) Canvas元素B
- Oracle FORM“悄悄地”提交
- HKEY_CLASSES_ROOT\CLSID\{26EE0668-A00A-44D7-9371-BEB064C98683}开始-程序-控制面板注册表