历史上的今天
今天是:2025年02月13日(星期四)
2020年02月13日 | ARM指令集—SWP指令
2020-02-13 来源:eefocus
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的文章中具体说明。
史海拾趣
|
H桥电机驱动原理与应用原著:吉姆布朗 1998年4月 整理上传:鲍勃乔丹 2002年9月 翻译:韦文潮 2007年12月本文的内容是要告诉大家什么是H桥以及它如何是工作的。 我们首先来看马达是如何转动的呢?举个例子:你手里拿着一节电池,用导线将马达和 ...… 查看全部问答> |
|
写了一个小的应用程序,通过修改注册表,设置成开机自动运行.(我用vs2005远程跑是没问题的) 可是,开机时会卡在log界面上.请问下高手,问题在哪里? 添加注册表如下: [HKEY_LOCAL_MACHINE\\init] \"Launch50\"=\"startup.exe\" \"Depend50\"=hex:14 ...… 查看全部问答> |
|
现在我的系统中使用的字型文件是一个名叫:mingliu.ttc的字型文件(这个是一个能支持繁体中文的字型文件)。现在我把系统的字体修改为:使用New Times Roman字型,这样就会出现一个问题,在显示中文的地方就会出现口口(框框)不能正常显示。这应该 ...… 查看全部问答> |
|
在嵌入式linux2.6.15内核下开发,目前开发需求要用串口传输数据,然而原先是直接调用socket通过访问以太网传输数据的,但是希望保留socket功能,希望变换物理介质,让socket将数据传递给串口进行收发工作。万望大虾的指点。在此先谢谢了!!!… 查看全部问答> |
|
具体大家看看这家公司的产品:http://www.newmsg.net/Product/NewMsg_UTC903SE.asp也可以 加我QQ: 1425156046… 查看全部问答> |
|
去年年末的时候团了LM3S9B96和LM3S811,记得那时候说拍0.01元的LM3S811是要交学习笔记的,所以从今天开始写学习笔记,还当时的承诺。持续时间大约为50天,每两天一篇,前15份学习笔记是基于811,后10份基于9B96。 ①先上图 ...… 查看全部问答> |
|
http://www.ti.com/lit/gpn/lm4f232h5qc Parametrics LM4F232H5QC Flash (KB) 256 StellarisWare in ROM Yes DMA 32 SafeRTOS 0 ...… 查看全部问答> |
|
小弟最近需要用TI的CodecEngine,使用的平台是合众达的6467T。在XDC工具中,有一个关于Platform的设定项。但是TI所给Platform package中是没有合众达平台的platform package的。于是我想自己创建一个。但是TI ...… 查看全部问答> |




