ARM 原子操作里的两个汇编指令

今天一个读者朋友给我留言,问了这个问题,ARM原子操作的汇编代码,还给我截图了两个不同的解释,让我说哪个是正确的。

原子操作的起因是为了内核同步,保证数据在正确性,之前已经吹过一波,可以看这几篇文章。

Linux 互锁斥 信号量 死锁 原子操作

第4章 原子操作

第4章 原子操作 第二节

CPU和和存储的连接图

原子操作的代码

我截取的这段是ARM7之后的代码,在ARM6之前的CPU并不支持SMP。所以原子操作的代码也分成了ARM6之前的和ARM7之后的区分。

#define ATOMIC_OP(op, c_op, asm_op)     \
static inline void atomic_##op(int i, atomic_t *v)   \
{         \unsigned long tmp;      \int result;       \\prefetchw(&v->counter);      \errata_855872_dmb();      \\__asm__ __volatile__("@ atomic_" #op "\n"   \
"1: ldrex %0, [%3]\n"      \
" " #asm_op " %0, %0, %4\n"     \
" strex %1, %0, [%3]\n"      \
" teq %1, #0\n"      \
" bne 1b"       \: "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)  \: "r" (&v->counter), "Ir" (i)     \: "cc");       \
}    

我们主要讨论两个汇编指令

LDREX <Rt>,[<Rn>]

LDREX 指令从「<Rn>」中获取「内存地址」,并且将「内存地址」的内容加载到「<Rt>」目标寄存器中。

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

STREX 指令从「<Rn>」中获取「内存地址」,并且将「内存地址」的内容加载到「<Rt>」目标寄存器中,并且把执行结果保存在 「<Rd>」。

在执行的时候,还有两个监视器在共同工作

  • local monitor 「本地监视器

  • global monitor「全局监视器

单CPU执行原子操作执行的同步情况

单CPU的情况下是不需要global monitor 参与的。

多CPU执行原子操作执行的同步情况

多CPU的情况下需要global monitor 参与。

关于这个同步机子的C语言嵌入汇编代码,还有更加详细的解释,大家如果有兴趣的话,可以看这几个链接,会更加详细。

http://www.wowotech.net/linux_kenrel/atomic.html

https://biscuitos.github.io/blog/ATOMIC/


  推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秒,在解答这个C语言题目上,我们都败了

看这篇文章之前&#xff0c;我觉得可以先看看下面这篇文章 看printk引发的一点思考不管我们用的printk还是printf&#xff0c;它们的核心都是可变参数的函数&#xff0c;所以可以拼接很多参数传递给函数实体&#xff0c;然后函数实体里面可以通过某种方式解析这些参数。看看这个…

Linux kernel 同步机制(下篇)

之前的文章Linux kernel同步机制在上一部分&#xff0c;我们讨论了最基本常见的几类同步机制&#xff0c;这一部分我们将讨论相对复杂的几种同步机制&#xff0c;尤其是读写信号量和RCU&#xff0c;在操作系统内核中有相当广泛的应用。读写信号量&#xff08;rw_semaphore&…

白话设计模式——Abstract Factory

Abstract Factory&#xff0c;把英文直接翻译过来的话就是“抽象工厂”&#xff0c;既然是工厂&#xff0c;那就肯定是生产产品的地方。不过&#xff0c;它不是生产同一类的产品&#xff0c;而是生产同一系列的产品。举个例子&#xff0c;广州本田现在生产3种汽车&#xff0c;O…

工程师实战:单片机裸机程序框架是怎样炼成的?

前言 前不久&#xff0c;我有位做测试的朋友转去做开发的工作&#xff0c;面试遇到了一个问题&#xff0c;他没明白&#xff0c;打电话问了我。题目大概就是&#xff1a;在单片机裸机开发时&#xff0c;单片机要处理多个任务&#xff0c;此时你的程序框架是怎样的呢&#xff1f…

c 语言指针教学视频,[C语言] 猎豹网校 C和指针视频教程

资源介绍21days_Cpp_二进制和十六进制.mp4xa0xa080x86_内联汇编.mp4xa0xa0ABG2C_for_循环.mp4xa0xa0ABG2C_关系运算符.mp4xa0xa0ABG2C_字符串.mp4xa0xa0ABG2C_循环.mp4xa0xa0ABG2C_数学运算.mp4xa0xa0ABG2C_更高级的运算符.mp4xa0xa0ABG2C_测试多个值.mp4xa0xa0ABG2C_终止循环.…

图解http

今天是周五&#xff0c;按照正常的情况&#xff0c;今天下班后将会经历一周中最愉快的时光&#xff0c;愉快的时间总是会有那么一些短暂&#xff0c;所以我就送给大家一个资料 「图解http」这是一个微信好友发给我的&#xff0c;他一直给我发送了很多很多消息&#xff0c;比如什…

为什么执行自己的程序要在前面加./

前言在Linux中&#xff0c;我们执行内置命令时&#xff0c;直接输入命令名称即可&#xff0c;如&#xff1a;$ mv a b #将a重命名为b而在执行自己写好的程序时&#xff0c;却要带上./&#xff0c;例如&#xff1a;$ hello hello: command not found $ ./hello hello world这是为…

C语言怎么计算数据类型范围?

之前在网上看到的一个讨论&#xff0c;是谁决定了数据类型的范围&#xff1f;比如说&#xff0c;怎么确定 char 就是 -128~127 &#xff0c;而不是 -127~128 呢&#xff1f;说下规定signed 的取值范围是 -(2N-1) to 2N-1 - 1unsigned 的取值范围是 0 to (2N-1) (2N-1 - 1)只要…

双十一为何规则复杂,套路多多

为啥不直接打5折?为了让你把“穷人”俩字写到自己脸上啊。 双十一快到了&#xff0c;今年我又一次有了不太想参加的感觉。作为一个阅读理解不太灵光的人&#xff0c;去年的活动我就整得不太明白——优惠券都是十块十块的&#xff0c;也不知道该咋用;还有预付款、整点秒杀之类的…

团建是什么鬼?

2012年我入职TCL&#xff0c;在TCL我体会到了团队建设的文化&#xff0c;也正是经历了那段职场&#xff0c;我明白了很多「可意味不可言传」。那时候我们经常五十成群出去吃饭、喝酒、唱歌&#xff1b;上学那会我很不喜欢团队活动&#xff0c;特别是室内的活动&#xff0c;总感…

Alpha 答辩总结

【Alpha展示评审表格】 小组序号小组名称格式&#xff08;20%&#xff09;内容&#xff08;20%&#xff09;PPT&#xff08;20%&#xff09;演讲&#xff08;20%&#xff09;答辩&#xff08;20%&#xff09;总分1天机组1515151516762PMS1617171616824“像我这么能打的还有五个…

一粒沙子变成芯片的全过程

推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言嵌入式Linux微信扫描二维码&#xff0c;关注我的公众号

要学会拒绝

Img「聊天截图」这是今晚上跟一个朋友聊天的截图&#xff0c;之后、突然想到这个话题&#xff0c;今年因为疫情&#xff0c;很多人抱怨工作不好找&#xff0c;我这个朋友&#xff0c;也是在疫情之下&#xff0c;可能是干得不开心&#xff0c;也可能还是干得不开心&#xff0c;可…

linux设备模型之kset/kobj/ktype分析

1. 概述今天来聊一下Linux设备模型的基石&#xff1a;kset/kobject/ktype。sysfs文件系统提供了一种用户与内核数据结构进行交互的方式&#xff0c;可以通过mount -t sysfs sysfs /sys来进行挂载&#xff1b;Linux设备模型中&#xff0c;设备、驱动、总线组织成拓扑结构&#x…

VLAN 路由实验图解

VLAN 路由实验图解(交换机为cisco1900系列)注&#xff1a;PC1&#xff1a;192.168.1.2 255.255.255.0PC2&#xff1a;192.168.2.2 255.255.255.0PC3&#xff1a;192.168.1.3 255.255.255.0PC4&#xff1a;192.168.2.3 255.255.255.0Fa0/0.1&#xff1a;192.168.1.1 255.255.255…

第 120 场双周赛 解题报告 | 珂学家 | 前后缀拆解 启发式合并

前言 忘名可以再记&#xff0c;回忆永不再来 整体评价 好像有一段时间没写周赛题解了&#xff0c;_. 感觉今天手感特别好&#xff0c;下午的几场比赛&#xff0c;包括传智杯都能打出超神战绩。 T3这题属于前后缀拆解&#xff0c;然后单调栈上二分(可以引入哨兵机制)&#xf…

音频系统,Alsa 里面的buff 是怎么计算的?

相关文章(干货)Ai音箱和Linux音频驱动小谈Linux ALSA 图解我在MTK平台下调试音频ALSA我们知道声音是模拟信号&#xff0c;模拟信号转成数字信号就一定有大小&#xff0c;既然有大小&#xff0c;那我们就需要开辟内存来保存这些数据。---- 我们知道&#xff0c;视频流的一帧就是…

用一句话证明你是程序员,你会怎么说

这个文章没有正文突然想到的一个话题&#xff0c;感觉很有意思如果用一句话透露出你是一个程序员你会怎么表露自己了&#xff1f;留言偷偷告诉我&#xff1f;

空间换时间,查表法的经典例子

前言 上一篇分享了&#xff1a;C语言精华知识&#xff1a;表驱动法编程实践这一篇再分享一个查表法经典的例子。我们怎么衡量一个函数/代码块/算法的优劣呢&#xff1f;这需要从多个角度看待。本篇笔记我们先不考虑代码可读性、规范性、可移植性那些角度。在我们嵌入式中&#…

Linux内核系统架构介绍

28年前(1991年8月26日)Linus公开Linux的代码&#xff0c;开启了一个伟大的时代。这篇文章从进程调度&#xff0c;内存管理&#xff0c;设备驱动&#xff0c;文件系统&#xff0c;网络等方面讲解Linux内核系统架构。Linux的系统架构是一个经典的设计&#xff0c;它优秀的分层和模…