免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1208 | 回复: 0
打印 上一主题 下一主题

[20110603]SWP和LDREX STREX [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览
早期的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。








您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP