当前位置: 首页 > news >正文

做淘宝客网站好搭建吗浏览网站手机响

做淘宝客网站好搭建吗,浏览网站手机响,建设建行积分兑换商城网站,杭州市钱江新城投资集团有限公司征集网站建设合作单位的公告嵌入式Linux应用开发-驱动大全-第一章同步与互斥② 第一章 同步与互斥②1.3 原子操作的实现原理与使用1.3.1 原子变量的内核操作函数1.3.2 原子变量的内核实现1.3.2.1 ATOMIC_OP在 UP系统中的实现1.3.2.2 ATOMIC_OP在 SMP系统中的实现 1.3.3 原子变量使用案例1.3.4 原子位介绍1…

嵌入式Linux应用开发-驱动大全-第一章同步与互斥②

  • 第一章 同步与互斥②
    • 1.3 原子操作的实现原理与使用
      • 1.3.1 原子变量的内核操作函数
      • 1.3.2 原子变量的内核实现
        • 1.3.2.1 ATOMIC_OP在 UP系统中的实现
        • 1.3.2.2 ATOMIC_OP在 SMP系统中的实现
      • 1.3.3 原子变量使用案例
      • 1.3.4 原子位介绍
        • 1.3.4.1 原子位的内核操作函数

第一章 同步与互斥②

在这里插入图片描述

1.3 原子操作的实现原理与使用

在上面的第 2个失败例子里,问题在于对 valid变量的修改被打断了。如果对 valid变量的操作不能被打断,就解决这个问题了。
这可以使用原子操作,所谓“原子操作”就是这个操作不会被打断。Linux有 2种原子操作:原子变量、原子位。

1.3.1 原子变量的内核操作函数

原子变量的操作函数在 Linux内核文件 arch\arm\include\asm\atomic.h中。
原子变量类型如下,实际上就是一个结构体(内核文件 include/linux/types.h):
在这里插入图片描述

特殊的地方在于它的操作函数,如下(下表中 v都是 atomic_t指针):
在这里插入图片描述

1.3.2 原子变量的内核实现

注意:SMP就是 Symmetric Multi-Processors,对称多处理器;UP即 Uni-Processor,系统只有一个单核 CPU。
这些函数都是在 Linux内核文件 arch\arm\include\asm\atomic.h中。
atomic_read,atomic_set这些操作都只需要一条汇编指令,所以它们本身就是不可打断的。
问题在于 atomic_inc这类操作,要读出、修改、写回。
以 atomic_inc为例,在 atomic.h文件中,如下定义:

#define atomic_inc(v)  atomic_add(1, v) 

atomic_add又是怎样实现的呢?用下面这个宏:

ATOMIC_OPS(add, +=, add) 

把这个宏展开:

#define ATOMIC_OPS(op, c_op, asm_op)   \ATOMIC_OP(op, c_op, asm_op)     \ATOMIC_OP_RETURN(op, c_op, asm_op)   \ATOMIC_FETCH_OP(op, c_op, asm_op) 

从上面的宏可以知道,一个 ATOMIC_OPS定义了 3个函数。比如“ATOMIC_OPS(add, +=, add)”就定义了这 3个函数:

atomic_add 
atomic_add_return 
atomic_atomic_fetch_add 或 atomic_fetch_add_relaxed 

我们以 ATOMIC_OP(add, +=, add)为例,看它是如何实现 atomic_add函数的,对于 UP系统、SMP系统,分别有不同的实现方法。

1.3.2.1 ATOMIC_OP在 UP系统中的实现

对于 ARMv6以下的 CPU系统,不支持 SMP。原子变量的操作简单粗暴:关中断,中断都关了,谁能来打断我?代码如下(arch\arm\include\asm\atomic.h):
在这里插入图片描述

1.3.2.2 ATOMIC_OP在 SMP系统中的实现

对于 ARMv6及以上的 CPU,有一些特殊的汇编指令来实现原子操作,不再需要关中断,代码如下(arch\arm\include\asm\atomic.h):
在这里插入图片描述

在 ARMv6及以上的架构中,有 ldrex、strex指令,ex表示 exclude,意为独占地。这 2条指令要配合使用,举例如下:
① 读出:ldrex r0, [r1]
读取 r1所指内存的数据,存入 r0;并且标记r1所指内存为“独占访问”。
如果有其他程序再次执行“ldrex r0, [r1]”,一样会成功,一样会标记 r1所指内存为“独占访问”。 ② 修改 r0的值
③ 写入:strex r2, r0, [r1]:
如果 r1的“独占访问”标记还存在,则把 r0的新值写入 r1所指内存,并且清除“独占访问”的标记,把 r2设为 0表示成功。
如果 r1的“独占访问”标记不存在了,就不会更新内存,并且把 r2设为 1表示失败。
假设这样的抢占场景:
① 程序 A在读出、修改某个变量时,被程序 B抢占了;
② 程序 B先完成了操作,程序 B的 strex操作会清除“独占访问”的标记;
③ 轮到程序 A执行剩下的写入操作时,它发现独占访问”标记不存在了,于是取消写入操作。 这就避免了这样的事情发生:程序 A、B同时修改这个变量,并且都自认为成功了。
举报个例子,比如 atomic_dec,假设一开始变量值为 1,程序 A本想把值从 1变为 0;但是中途被程序B先把值从 1变成 0了;但是没关系,程序 A里会再次读出新值、修改、写入,最终这个值被程序 A从 0改为-1。
在 ARMv6及以上的架构中,原子操作不再需要关闭中断,关中断的花销太大了。并且关中断并不适合SMP多 CPU系统,你关了 CPU0的中断,CPU1也可能会来执行些操作啊。
在 ARMv6及以上的架构中,原子操作的执行过程是可以被打断的,但是它的效果符合“原子”的定义:一个完整的“读、修改、写入”原子的,不会被别的程序打断。它的思路很简单:如果被别的程序打断了,那就重来,最后总会成功的。

1.3.3 原子变量使用案例

现在可以使用原子变量实现:只能有一个 APP访问驱动程序。代码如下:

01 static atomic_t valid = ATOMIC_INIT(1); 
02 
03 static ssize_t gpio_key_drv_open (struct inode *node, struct file *file) 04 { 
05      if (atomic_dec_and_test(&valid)) 
06      { 
07              return 0; 
08      } 
09      atomic_inc(&valid); 
10      return -EBUSY; 
11 } 
12 
13 static int gpio_key_drv_close (struct inode *node, struct file *file) 
14 { 
15      atomic_inc(&valid); 
16      return 0; 
17 } 
18 

第 5行的 atomic_dec_and_test,这是一个原子操作,在 ARMv6以下的 CPU架构中,这个函数是在关中断的情况下执行的,它确实是“原子的”,执行过程不被打断。
但是在 ARMv6及以上的 CPU架构中,这个函数其实是可以被打断的,但是它实现了原子操作的效果,如下图所示:
在这里插入图片描述

1.3.4 原子位介绍

1.3.4.1 原子位的内核操作函数

能操作原子变量,再去操作其中的某一位,不是挺简单的嘛?不过不需要我们自己去实现,内核做好了。
原子位的操作函数在 Linux内核文件 arch\arm\include\asm\bitops.h中,下表中 p是一个 unsigned long指针。
在这里插入图片描述

1.3.4.2 原子位的内核实现
在 ARMv6以下的架构里,不支持 SMP系统,原子位的操作函数也是简单粗暴:关中断。以 set_bit函数为例,代码在内核文件 arch\arm\include\asm\bitops.h中,如下
在这里插入图片描述

在 ARMv6及以上的架构中,不需要关中断,有 ldrex、strex等指令,这些指令的作用在前面介绍过。还是以 set_bit函数为例,代码如下:
在这里插入图片描述

我不再使用原子位操作来写代码,留给你们练习吧。

http://www.yayakq.cn/news/95569/

相关文章:

  • vs如何做网站平面设计公司属于什么行业
  • 在建设部网站首页济南网站建设咨询小七
  • 网站后台欢迎界面化妆品行业的网站开发
  • 专业网站制作哪便宜wordpress 导入demo
  • 怎样建立企业网站建搜索引擎网站
  • 广西城乡住房建设厅网站杭州做网站hzyze
  • 关于网站建设心得体会电影网站怎么做优化
  • 网站建设免费的广告设计专业描述
  • 网站首页关键词佛山网站设计专业
  • 小型网站开发需要什么步骤玉林做网站优化推广
  • 吉林省建设厅网站评职称系统北京二手房
  • 扁平化的网站结构图郑州炫彩网站建设
  • 宁安市建设局网站网站开发实训报告参考文献
  • 有哪些网站可以做全屏代码简单网站的制作
  • 做译员的网站外贸建设网站公司
  • saas建站青海专业网页设计免费建站
  • 书店网站模版小升初在线做试卷的网站
  • 免费承接网站建设中国招标投标网查询平台
  • 如何直接用jsp做网站不写servlet阿里云建立网站
  • 河北建设银行招聘网站最好的app开发公司
  • 阜城网站建设代理wordpress文章加载
  • 北京西站网站建设合同封皮
  • 湛江网站建设托管wordpress 添加地图吗
  • 谁的网站模板利于优化关于校园网站建设的通知
  • 新潮远网站建设网页文件的扩展名
  • 众美商务公馆做网站高端精品网站建设
  • 电子政务网站建设公司html基础标签
  • 宣武门网站建设钦州seo
  • 东莞招聘网站猎头公司应坚持的原则有
  • 西安网站建设方案wordpress next posts link