strex,ldrex

volatile bool lock = false;

void func(void)

{

int i;

while(lock);

lock = true;

for(i = 0; i < 4; i++)

{

printk("pid = %d comm = %s \n",

current->pid, current->comm);

mdelay(1000);

}

lock = false;

}

对于上面的例子,在SMP系统中,假设cpu0的进程A获得了锁,cpu1的进程B、 cpu2的进程C由于拿不到锁而一直在while处空转,等待锁的释放。但是当cpu0的进程A在释放锁时,如果不能保证原子性,那么cpu1的进程B、 cpu2的进程C是有可能同时拿到锁的,此时临界区中的资源访问就不会按照预定的方式执行。在C的软件层面上,是不能保证原子性的,那么只有在硬件层面上去保证,庆幸的是armv6及以上的版本支持strex和ldrex指令来保证多核之间的数据同步和控制并发问题。

static inline void arch_spin_lock(arch_spinlock_t *lock)
{
    unsigned long tmp;

__asm__ __volatile__(
"1: ldrex   %0, [%1]\n"
"   teq %0, #0\n"                         //TEQ 按位异或,这里判断tmp是否为0,即锁是否被占用。
    WFE("ne")                              //tmp不等於0就执行WFE,使处理器进入a low-power state等待状态
"   strexeq %0, %2, [%1]\n"        //当前进程加锁操作,成功tmp=0,失败tmp=1
"   teqeq   %0, #0\n"
"   bne 1b"
    : "=&r" (tmp)
    : "r" (&lock->lock), "r" (1)
    : "cc");                                   //如果你使用的指令会改变CPU的条件寄存器cc,需要在修改描述部分增加“cc”

smp_mb();
}

========================

WFE:

Wait For Event is a hint instruction that permits the processor to enter a low-power state until one of a number of
events occurs,

Encoding A1 ARMv6K, ARMv7 (executes as NOP in ARMv6T2)
     WFE <c>

========================

LDREX

Load Register Exclusive calculates an address from a base register value and an immediate offset, loads a word from

memory, writes it to a register and:

•     if the address has the Shared Memory attribute, marks the physical address as exclusive access for the

executing processor in a global monitor

•     causes the executing processor to indicate an active exclusive access in the local monitor.

Encoding A1           ARMv6*, ARMv7
     LDREX<c> <Rt>, [<Rn>]

Assembler syntax

LDREX{<c>}{<q>}  <Rt>, [<Rn> {, #<imm>}]

where:

<c>, <q>     See Standard assembler syntax fields on page A8-287.

<Rt>           The destination register.

<Rn>          The base register. The SP can be used.

<imm>        The immediate offset added to the value of <Rn> to form the address. <imm> can be omitted, meaning

an offset of 0. Values are:

Encoding T1              multiples of 4 in the range 0-1020

Encoding A1              omitted or 0.

Operation

if ConditionPassed() then

EncodingSpecificOperations(); NullCheckIfThumbEE(n);

address = R[n] + imm32;

SetExclusiveMonitors(address,4);

R[t] = MemA[address,4];

==========================

STREX

Store Register Exclusive calculates an address from a base register value and an immediate offset, and stores a word

from a register to memory if the executing processor has exclusive access to the memory addressed.

Encoding A1           ARMv6*, ARMv7

STREX<c> <Rd>, <Rt>, [<Rn>]

Assembler syntax

STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn> {, #<imm>}]

where:

<c>, <q>     See Standard assembler syntax fields on page A8-287. 
         
<Rd>        The destination register for the returned status value. The value returned is:                  
                   0           if the operation updates memory              
                   1           if the operation fails to update memory. 
        
<Rt>      The source register. 
         
<Rn>     The base register. The SP can be used. 
         
<imm>     The immediate offset added to the value of <Rn> to form the address. Values are multiples of 4 in the 
                   range 0-1020 for encoding T1, and 0 for encoding A1. <imm> can be omitted, meaning an offset of 0.

Operation

if ConditionPassed() then

EncodingSpecificOperations(); NullCheckIfThumbEE(n);

address = R[n] + imm32;

if ExclusiveMonitorsPass(address,4) then

MemA[address,4] = R[t];

R[d] = 0;

else

R[d] = 1;

时间: 2024-10-19 05:14:05

strex,ldrex的相关文章

【转】朱兆祺带你一步一步学习嵌入式(连载)

原文网址:http://bbs.elecfans.com/jishu_357014_2_1.html#comment_top  从最初涉及嵌入式Linux开始到现在,深深的知道嵌入式的每一步学习都是举步维艰.从去年11月份开始,我就着手整理各种学习资料,希望推动嵌入式学习的前进贡献自己微不足道的一份力量.从去年到现在,将C语言的学习经验整理成<攻破C语言笔试与机试陷阱及难点>(现在仍在更新),这份资料已经在电子发烧友论坛的单片机论坛连载(http://bbs.elecfans.com/jish

Java的线程安全

线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别的. 共享的数据 可以将Java语言中各种操作共享的数据分为以下5类:不可变.绝对线程安全.相对线程安全.线程兼容和线程对立. 不可变 不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施,final关键字带来的可见性,只要一

ARM(CM3)的汇编指令

转http://blog.csdn.net/gaojinshan/article/details/11534569 16位数据操作指令 名字 功能ADC  带进位加法(ADD with Carry) ADD  加法 AND  按位与.这里的按位与和C的”&”功能相同 ASR  算术右移(Arithmetic Shift Right) BIC  按位清零(把一个数跟另一个无符号数的反码按位与) CMN  负向比较(把一个数跟另一个数据的二进制补码相比较) CMP  比较(Compare,比较两个数

深入分析Linux自旋锁

原创 2016-08-12 tekkamanninja CU技术社区 作者| tekkamanninja本文版权由tekkamanninja所有,如需转载,请联系本公众号获取授权!在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的模块.但是在我的ARMv7的单核CPU(TI的A8芯片)中测试的时候,不会锁死,并且自旋锁可以多次获取.实验现象和我对自旋锁和休眠的理解有出路.      我后来我将这个模块放到自己的PC上测试,成功锁死了,说明我的模块原理上没有问题.但是为什

《Linux设备驱动开发详解(第3版)》海量更新总结

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2015.2.26 几乎完成初稿. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第1章 <Linux设备驱动概述及开发环境构建>[D]删除关于LDD6410开发板的介绍[F]更新新的Ubuntu虚拟机[N]添加关于QEMU模拟vexpress板的描述 第2章 <驱动设计的硬件基础> [N]增加关于SoC的介绍:[N]增加关于eFuse的内容:[D]删除ISA总线的内容了:[N]增加关于SP

Exclusive access control to a processing resource

A data processing system is provided with multiple processors that share a main memory. Semaphore values associated with data elements within the memory system, including the main memory, are used to establish exclusive access permissions to those da

原子操作--ARM架构

说明:内核版本号为3.10.101 一.ARM架构中的原子操作实现 在原子操作(一)中我们已经提到,各个架构组织为“复仇者”联盟,统一了基本的原子变量操作,这里我们就拿atomic_dec(v)来看看通天ARM的实现. 首先是atomic_dec(v)原子减一操作的宏定义.这个宏的定义在文件arch/arm/include/asm/atomic.h中: #define atomic_dec(v) atomic_sub(1, v) 对于ARM架构不同的版本,stomic_sub(i,v)的实现是不

Linux内核同步机制之(二):Per-CPU变量

转自:http://www.wowotech.net/linux_kenrel/per-cpu.html 一.源由:为何引入Per-CPU变量? 1.lock bus带来的性能问题 在ARM平台上,ARMv6之前,SWP和SWPB指令被用来支持对shared memory的访问: SWP <Rt>, <Rt2>, [<Rn>] Rn中保存了SWP指令要操作的内存地址,通过该指令可以将Rn指定的内存数据加载到Rt寄存器,同时将Rt2寄存器中的数值保存到Rn指定的内存中去.

ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联

ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联 CCI-400 集合了互联和一致性功能,有 2 个 ACE slave 接口和 3 个 ACE-Lite slave 接口,有 3 个 AXI master 接口.2 个 ACE slave 接口可以相互 snoop 对方,ACE-Lite slave 接口可以 snoop 这 2 个 ACE slave 接口.本文首先介绍cci-400相关结构,然后以内核的panic为引子,最后给出导致内核pa