arm指令集—swp指令

cynchanpin cynchanpin     2022-09-14     413

关键词:

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指令集thumb指令集thumb-2指令集

MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集  ARM指令集:编代码全部是32bits的,每条指令能承载更多的信息,因此使用最少的指令完成功能,所以在相同频率下运行速度也是最快的,但也因为... 查看详情

arm精简指令集与复杂指令集

...平板成为同一个硬件下的系统。而ARM使用的就是CISC精简指令集,大学汇编没有学好,只能在此补上...??CISCComplexInstructionSetComputer即为复杂指令集,CISC的硬件指令更多,因此它的兼容性更好,执行复杂操作更快,因此在游戏机、... 查看详情

嵌入式:arm指令集分类及编码

ARM指令集是32位的,程序的启动都是从ARM指令集开始。主要是以下三个方面:指令分类及指令格式条件执行指令集编码指令分类及指令格式ARM指令使用的基本格式如下:〈opcode〉〈cond〉S〈Rd〉,〈Rn〉,〈operand2〉<>是必须项,... 查看详情

[arm]arm指令集

ARM指令集 一、ARM指令的格式和分类经典ARM指令格式如下:<opcode><cond>S<Rd>,<Rn>,<operand2><opcode> <cond> S  <Rd>,<Rn>,<operand2>& 查看详情

armip核结构

...在完善和发展。为了清楚地表达每个ARM应用实例所使用的指令集,ARM公司定义了6种主要的ARM指令集体系结构版本,以版本号V1~V6表示ARM版本Ⅰ:V1版架构该版架构只在原型机ARM1出现过,只有26位的寻址空间,没有用于商业产品... 查看详情

arm指令集

  ARM指令可以分为数据处理类指令、跳转类指令、异常中断指令、Load/Store指令、协处理器指令、操作CPSR指令等几类。1、数据处理指令其中第二个操作数<shifter_operand>可以有三种形式:(1)立即数形式   &nb... 查看详情

arm指令集——跳转指令

  ARM汇编指令条件执行在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位。在数据处理指令中使用S后缀来实现该功能。 不要在CMP,CMN,TST或者TEQ指令中使用S后缀。这些... 查看详情

arm指令集

4、跳转指令  ARM中实现程序跳转有两种方法,一种是直接给PC(R15)寄存器赋值,另一种是利用跳转指令。  第一种跳转方式可以实现整个32位地址空间范围内的跳转。而第二种跳转方式只能够实现前后32MB范围内的... 查看详情

arm指令集

S后缀:  在指令后面加上S后缀后,指令运行后的结果会改变CPSR中条件标志位的值。某些指令不加S后缀也会无条件改变CPSR中的条件标志位,如CMP、TST等指令。其他的指令不加S后缀的话,其指令运行的结果是不会改变CPSR... 查看详情

ios指令集arm64、armv7s、armv7、i386、x86_64

参考技术AARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachine),是一个32位精简指令集(RISC)处理器架构,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。ARM和Intel处理器... 查看详情

arm汇编基础上(代码片段)

ARM是一个精简指令集处理器,其指令集的设计是定长的,也就是其汇编对应的机器码是定长的(2字节或者4字节)。那么对于定长而言,其优点就是更快的被执行,因为这样CPU取指令译码的速度相对x86的CPU... 查看详情

cpu指令集架构

参考资料:漫话CPU指令集架构-知乎(zhihu.com)目前市面上存在两种指令集架构类型:ReducedInstructionSetComputing(RISC)精简指令集,比如ARM,MIPS等ComplexInstructionSetComputing(CISC)复杂指令集,比如Intel的X86等简单说,一精简指令集就是只规定非... 查看详情

比较armv7指令集与armv6指令集具都有哪些变化

...两颗1GHzCortex-A9核心组成。ARM11架构发布于2002年,基于ARMv6指令集,包括ARM1136J、ARM1156T2和ARM1176JZ三个内核型号,其中后缀带J的表示支持Java代码硬件加速,T则表示支持Thumb-2指令。ARM11采用8级流水线,能够支持多核架构。在使用130... 查看详情

arm指令分类及其寻址方式

ARM指令分类及其寻址方式一:ARM指令的分类  ARM指令集可以分为以下6类:  •跳转指令;  •数据处理指令;  •程序状态寄存器(PSR)传输指令;  •load/store指令;  •协处理器指令;  •异常... 查看详情

未来是属于arm为代表的精简指令集还是x86为代表的复杂指令集?

分析一: 这里简单来谈一下,ARM和X86之间为什么不太具有可比性的问题。要搞清楚这个问题首先要明白什么是架构,之前也有很多人提到了架构不同,但架构是什么意思?它是一个比较抽象的概念,不太容易用几句话就解释... 查看详情

armneon指令集总结

ARM的NEON是类似于X86的SSE2的一种优化的指令集,主要就是为了实现SIMD全称SingleInstructionMultipleData,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。简单来说就是处理一些算法的时候,可以并行... 查看详情

arm汇编指令

ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令6大指令一、跳转指令跳转指令用于实现程序流程的跳转跳转指令分类Ⅰ.使用专门的跳转指令... 查看详情

arm体系结构

ARM内核采用精简指令集结构(RISC,ReducedInstructionSetComputer)体系结构。其目标是设计出一套能在高时钟频率下单周期执行、简单而有效的指令集,RISC的设计重点在于降低硬件执行指令的复杂度,这是因为软件比硬件容易提供更... 查看详情