ARM指令集—SWP指令
ARM指令集—SWP指令
SWP和SWPB是ARM指令集中对存储单元的原子操作。即对存储单元的一次读和一次不可被切割。
SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8bit)的数据交换。
SWP指令主要是完毕ARM体系架构处理器的同步操作。在Linux操作系统中实现信号量的操作。可是此指令在ARMv6架构后就没有採用了,而是通过扩展的LDREX和STREX实现。本片文章主要介绍SWP的功能,对于LDREX和STREX以后再介绍。
SWP的指令格式例如以下:
SWP {}{B} Rd, Rm, [Rn]
当中Rd是目的寄存器,从存储器中读到的值存放于此寄存器中
Rm寄存器是操作数。会将此寄存器中的值存放于存储单元中
[Rn]是寄存器间接寻址,Rn保存的是某个存储单元的地址
如果[Rn]中存放的是信号量。当某程序要改动信号量时,则会调用SWP指令完毕对信号量的操作,即对这个存储单元的读和写是一个原子操作。不会被打断,命令的运行步骤例如以下图1所看到的:

图1
当多个程序要訪问他们共享的资源时,我们必需要做好同步机制以保证数据的安全。通常,共享的资源能够是一段共享内存或者是外部设备。訪问这些资源的能够使CPU、进程或者是线程。
为了完毕同步机制,会採用一个原子变量来保存资源的状态。
比例如以下图2所看到的,用一个二元信号量(0或者1)来实现共享资源的同步,当进程A 和 进程B都要訪问信号量Semaphore。

图2
对于A进程。
先訪问到信号量Semaphore发现状态可用,应该立即会改动Semaphore的状态。告诉其它进程此资源正在被使用。可是可能因为时间片恰好用完,系统调度到进程B。
进程B訪问到信号量时发现状态也可用。于是
改动Semaphore告诉其它进程此资源正在被使用,等到系统再次调度到进程A时,进程A却不知道进程B已改动了Semaphore而且使用了公共资源,于是接着上次未完毕的任务,
開始改动Semaphore而且開始使用公共资源。因此。遇到这种情况的话,信号量形同虚设并没有起到同步的作用。
所以假设使用SWP指令,通过上面的介绍,SWP指令时完毕对存储单元的一次读和写的原子操作。就能够避免这种情况。
以下的汇编代码是通过SWP实现相互排斥的样例
EXPORT lock_mutex_swp
lock_mutex_swp PROC
LDR r2, =locked
SWP r1, r2, [r0] ; Swap R2 with location [R0], [R0] 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, [r0] ; Write value ‘unlocked’ to location [R0]
BX lr
ENDP
当然,除了上面的情况,还可能因为中断的产生导致读和写的操作被打断。
在一些任务比較简单的系统中,能够在关键的代码中利用禁止中断的方式来保证对数据操作的原子性,然而对于如今复杂的多任务操作系统,禁止中断的做法显然不是有效的解决方法。
所以SWP通过特殊的訪问方式,不须要禁止中断。可是这样也会延长中断的响应时间。随着处理器的高速发展,多核处理器已经显示出了强大的优势,同步的问题显得更加明显。如图3所看到的,一个系统由一个Cortex-A8和Cortex-M4组成。他们都会訪问一同一段存储空间。

图3
SWP指令在这样的模式下。就显得非常尴尬了,假设依旧採用原来的特殊訪问模式,可能会大大减少多核处理的性能。
所以从ARMv6架构以后。不再使用SWP指令实现同步的功能,而是添加了LDREX和STREX指令完毕相关的操作。
具体使用情况,会在LDREX和STREX的文章中具体说明。
ARM指令集—SWP指令的更多相关文章
- ARM指令集----杂项指令
ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...
- ARM指令集——数据处理指令
ARM汇编指令集 ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译, ...
- ARM指令集——条件执行、内存操作指令、跳转指令
ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...
- ARM指令集(上)
ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1 指令格式 (1)基本格式 ...
- 常用 ARM 指令集及汇编
ARM7TDMI(-S)指令集及汇编 ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制 较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 T ...
- 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...
- (二十三)ARM平台NEON指令的编译和优化
ARM平台NEON指令的编译和优化 本文介绍了ARM平台基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9 ...
- ARM指令集详解--汇编
1. 汇编 1.1. 通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的 ...
- ARM的栈指令
ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...
随机推荐
- 关于HTML5 boilerplate 的一些笔记
最近在研究HTML5 boilerplate的模版,以此为线索可以有条理地学习一些前端的best practice,好过在W3C的文档汪洋里大海捞针……啊哈哈哈…… 开头的IE探测与no-js类是什么 ...
- GUC-4 CopyOnWriteArrayList/CopyOnWriteArraySet
/* * CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” * 注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大.并发迭代操作多 ...
- Js~对数组的操作
在工作中可能用的不多,但一些特殊的场合还是会用到,所以在这里,把JS的数组操作总结一下,分享给大家! Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对象的语法: ...
- vue 环境搭建笔记
环境 开发工具:VS Code vue版本: 2.x 准备 使用 npm 包管理器进行安装,也可以使用 yarn 包管理器. 可以使用淘宝的 npm 镜像,国内速度更快. 使用方式: $ npm in ...
- pool创建多进程
这中方式用的比较多,毕竟要控制并发数量,不可能不限制并发数 #_*_coding:utf-8_*_ from multiprocessing import Pool import time def f ...
- Dalvik 虚拟机 jvm 区别
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha dalvik 基于 寄存器, jvm基于 栈. 寄存器,编译时间会更短. dalvik ...
- 埃及分数 a* 搜索 知识点mark
题意 在古埃及,人们使用单位分数的和(即1/a,a是自然数)表示一切有理 数. 例如,2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为在加数中不允许有相同的. 对于一个分数a/b,表示方法 ...
- 【二项式定理】【DFS】UVALive - 7639 - Extreme XOR Sum
题意:一个序列,q次询问,每次问你某个指定区间内的EXtreme XOR值. 一个长度为l的区间的EXtreme XOR值被定义为,从左到右,将每相邻的两个数XOR起来,产生l-1个新的值,……如此循 ...
- Eclipse里选中一个变量后,这个类里的该变量不变色了?
Eclipse里选一个变量后,这个类里的该变量不变色了. 1.使用“Alt+Shift+O”对该提示功能的开/关切换 2.可以在以下设置选中后的文本提示颜色 window--> Prefere ...
- 【ArcGIS笔记】数据处理
1.ARCGIS在导入Excel坐标点的时候出现"没有注册类"的情况怎么办? 确保你本机上装有office,并且版本要能够识别XLSX格式.2007以上. 2.导入excel时re ...