指令LDREX,STREX是在armv6中新加的指令,配合AMBA3--AXI中的lock[1:0]信号。

在Atomic Access一节中是这么规定的:ARLOCK[1:0]/AWLOCK[1:0]信号为2'b00-------Normal access

ARLOCK[1:0]/AWLOCK[1:0]信号为2'b01-------Exclusive access

ARLOCK[1:0]/AWLOCK[1:0]信号为2'b10-------Locked access

exclusive的操作相对于lock操作的优点是:只根据返回的resp来确定原子操作是否正确,不会影响interconnect的性能。

对于Exclusive access,从slave的角度来看,首先slave必须支持Exclusive的访问,具体slave必须有一些monitors 来记录收到exclusive访问时的,

ARID/AWID,ARADDR/AWADDR,ARSIZE/AWSIZE,ARLEN/AWLEN。总之必须保证访问的master和地址完全的一致。

其中的ARID/AWID由arm core来决定,如果是core0,ARID/AWID一般就是0。

从master的角度来看,master要发出一个exclusive的访问必须,先发出exclusive read后再发出exclusive write来完成一次exclusive的访问。

1)对于exclusive访问,正确的response是EXOKAY。而由于有的slave不支持exclusive的访问后直接忽视掉lock信号,此时就会

返回OKAY信号。

2)在exclusive read之后,slave仍可在该地址接收normal write,此时如果exclusive指定的地址中的数据已经改变,则slave不

会再下次exclusive write的时候,返回EXOKAY,取而代之会返回OKAY,表示出错了,此时write的值也不会写入。

3)在一次exclusive read会后,可以不等exclusive write,直接再发出exclusive read,这样slave monitor的地址就会改变,

相当于发起一个新的exclusive操作。

exclusive的操作,不能是cache的属性。

在slave端,monitor的最小的地址是length*size,同样也可以monitor一个比这个乘机更大的地址空间,但是这样可能会使本来正确的

exclusive access却报出了错误。

对于lock操作,主要需要interconnect保证只有特定ID的master可以访问一个特定的slave地址,直到同一ID的master发出一个unlock的操作接收到。

一个master可以开始一个read/write的lock sequence,但这时必须保证没有其他的outstanding的transaction等待完成。

当一个master开始一个lock的transaction时,必须保证没有其他的locked的transaction还没有完成。

master必须保证一个locked transaction sequences中,最多只有两个transaction,同时在lock操作的过程中,

所有的transaction都必须是同样的ID,一个lock的sequence,以最后一个unlock的transaction结束。ARLOCK/AWLOCK信号无效。

LDREX和STREX指令可以用在多个处理器和共享内存系统之间,实现进程间的通信。

LDREX表示从储存器加载数据,相当于读操作,

如果该物理地址有共享TLB属性,则LDREX会将该物理地址标记为由当前处理器独占访问,并且清除该处理器对其他任何物理地址的任何独

占访问标志。然后将该物理地址标记为一个未完成的exclusive访问。

如果该物理地址没有共享TLB属性,直接将该物理地址标记为一个未完成的exclusive的访问。

void ldrex32(WORD addr, WORD *data)

{   asm("ldrex r2, [r0]");     asm("str  r2, [r1]");   }

STREX表示向存储器储存数据,相当于写操作,

如果该物理地址没有共享TLB属性,如果该执行处理器中有一个已标记未访问完成的exclusive操作时,STREX会进行储存,result返回0。

如果该执行处理器无一个已标记未访问完成的exclusive操作时,STREX不会进行储存,result返回1。

如果该物理地址有共享TLB属性,如果该执行处理器中有一个已标记独占访问的未访问完成的exclusive操作时,STREX会进行储存,

result返回0。

如果该执行处理器中无一个已标记独占访问的未访问完成的exclusive操作时,STREX不会进行储存,

result返回1。

void strex32(WORD addr, HALF data, WORD *result)

{   asm("strex r3, r1, [r0]");     asm("str  r3, [r2]");   }

AXI中的memory attribute属性,由AxCache信号来指定,0-3bit分别代表Bufferable,Cacheable,Read Allocate,Write Allocate。

    AxCache[0],Bufferable,只针对写操作,表示interconnect,或者其他类似component,可以先返回resp,之后再

        写向final distination。

    AxCache[1],1) 与RA,WA配合,控制cache;

           2) 表示transaction的属性,可以在中间被更改,对于write操作,很多的write操作可以进行merge。

                                对于read操作,表示该地址可以被prefetch。

    AxCache[2],Read之后更新到cache line中。

    AxCache[3],Write的时候,cache line中也保存最新的值。

Bus,Exclusive access,memory attribute的更多相关文章

  1. Bus memory attribute

    根据程序的局部性原理,在主存与CPU之间设置的一个高速的容量较小的存储器,叫做cache. ARM cache架构由cache存储器和写缓冲器(write-buffer)组成.其中Write_buff ...

  2. IEEE 802.11p (WAVE,Wireless Access in the Vehicular Environment)

    IEEE 802.11p(又称WAVE,Wireless Access in the Vehicular Environment)是一个由IEEE 802.11标准扩充的通讯协定.这个通讯协定主要用在 ...

  3. access基本操作(c#操作,远程连接,执行sql,加密,备份)

    前言 最近项目用到了access,是的就是access,工作在桌面型的小数据库应用还是会用到的,如果你确定永远不会遇到access的操作,请忽略此篇文章 1.vs配置access 既然是数据库,就少不 ...

  4. Mysql创建新用户后无法登录,提示 Access denied for user 'username'@'localhost' (using password: YES)

    MySQL创建新用户后无法登录,提示 Access denied for user 'username'@'localhost' (using password: YES) ,多半是因为存在匿名用户, ...

  5. access数据库用sql语句添加字段,修改字段,删除字段

    用 Create Table 建立一个表 Table1 ,主键是自动编号字段,另一个字段是长度是 10 的文本字段. 代码如下:CREATE TABLE Table1 (Id COUNTER CONS ...

  6. 打开office2010里面的access,总是提示要配置Office single image

    刚安装了,office2010,打开里面的access时,总是提示要配置Office single image,但打开word和excel没问题,很是不舒服 在网上找到N种方法,试下来还是不行. 后来 ...

  7. 显示刚刚添加的最后一条数据,access,选择语句,select

    显示刚刚添加的最后一条数据,access,选择语句,select select top 1  * from s1 order by id desc

  8. Delphi 异或,英文为exclusive OR,或缩写成xor

    异或,英文为exclusive OR,或缩写成xor 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: a⊕b = (¬a ∧ b) ∨ ...

  9. 发布网站,报Access to the path is denied的解决办法

    错误: Server Error in '/' Application.---------------------------------------------------------------- ...

随机推荐

  1. php底层变量分析

    <?php //数组引用 $arr = array('a','b','c','d'); $x = & $arr[1]; $tmp = $arr; $arr[1] = 'e'; echo ...

  2. python 里面的%s和%r的区别

    虽然这两个占位符(pytho里叫做格式符)用法相同,但是效果却是不一样的 %s是将变量传到str()函数中,结果是将变量转化适合人阅读的格式 %r是将变量穿到repr()函数中,结果是将变量转化成适合 ...

  3. 【CF827F】Dirty Arkady's Kitchen DP

    [CF827F]Dirty Arkady's Kitchen 题意:给你一张n个点,m条边的有向图,每条边长度为1,第i条边在[li,ri)的时间内可以进入,求1到n的最短路. $n,m\le 5\t ...

  4. python requests模块中返回时间elapsed解析

    一.问题: Python 中requests库在发送http请求时相当方便好用,但在使用时一直受一个问题困扰,怎么才能查看请求时长呢? 自己写时间函数再相减?NO,这个方法肯定不行. 二.解决: 好吧 ...

  5. Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置

    在Thinkphp框架下根目录打开index.php 在头部加入如下代码即可: //入口文件 define('DOMAIN','abc.com');//abc.com换成自己的跟域名 //以下两行是为 ...

  6. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  7. codeforces 592B/C

    题目链接:http://codeforces.com/contest/592/problem/B B. The Monster and the Squirrel time limit per test ...

  8. 解决UITableView分割线距左边有距离的办法

    首先在viewDidLoad方法中加上如下代码: if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {    ...

  9. 单例模式:Qt本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性

    标题起的是有点大 主要是工作和学习中,遇到些朋友,怎么说呢,代码不够Qt化 可能是由于他们一开始接触的是 Java MFC 吧 接触 Qt 7个年头了 希望我的系列文章能抛砖引玉吧 单例模式 很多人洋 ...

  10. Python开发【笔记】:pymsyql 插入一条数据同时获取新插数据的自增id的两种方式

    一.通过cursor.lastrowid import pymysql.cursors # Connect to the database connection = pymysql.connect(h ...