嵌入式学习笔记--关于ARM中SWP指令的执行顺序问题【待验证】
2014-02-12 17:40
597 查看
看国嵌的视频,这段文字可能是他抄的,关于顺序,
SWP R0,R1,[R2]
有文字“同时将R1中的数据存到R2所指的内存中“,或许”同时“也表达了”然后“?(文字这东西~意思太多),但是要想合乎逻辑,我姑且理解”同时“这个字眼有不计顺序同时完成的意思吧。
但是做视频的人自己给SWP指令解读出了先后顺序,还给画了箭头和小标号——也就是先R2指向的内存中的内容先存到R0,再把R1中的数据存到R2指向的内存中。
讽刺的是,这段文字包含了两个例子
第二个例子:
SWP R0,R0,[R1]
可以完成R0和R1指向的存储器中的数据的交换,这就搞笑了,你先把R1指向的数据读到R0,再从R0把R1指向的内存内容复制回该内存,多此一举,明显的要丢失R0数据了。
所以我暂时认为他讲的是错的(国嵌视频师综合素质比较低,对计算机方面基础知识的掌握和基本的读英文单词的能力欠佳。但是实践部分——作为手把手教你摸板子的启蒙,还有很有价值的。而且视频中讲师不光自己臆断出第一步和第二步,还给学生强化洗脑,让他们回答第一步是什么第二步是什么,看来不去培训班是对的。我看国嵌也是买飞凌6410送的做参考)
只能暂时认为他是”同时的“,具体内部怎么同时,暂时没掌握验证方法,先做计划:
方法一:看指令能否拆解成更小的指令,里边有没有用一个其他寄存器做temp——这就说的通了。
方法二:查资料——巧的是,网上搜一下,也有这种谬论,将”同时“解读为先后,还把这个谬论发扬壮大了,把模棱两可的”同时“直接写成了”然后“,更煞有介事的把指令拆解成了ldr和str,,见附1。真是不可原谅,你再没有逻辑,有点实践有点C基础的人也知道交换要有个temp吧,你直接用A=B;B=A;这种语句能做交换么?[b]所以我暂时认为他的博客也是错的[/b]
方法三:跟CPU时序(或者叫指令时序?计算机组成原理的基础给忘了)有关,细分就是里边有类似于X、Y这种寄存器来做temp——有点需要基础,这种解释比较靠谱,但是现在的阶段是要自己用板子去验证,主要还看ARM的原子操作自己究竟能验证接触到多么”原子“的程度。
留个后路:为了保持逻辑上的无懈可击,不因为我自己的一个误解把他俩都一棒子打死。我保留”国嵌视频中第二个例子SWP R0,R0,[R1] 是他们杜撰的用法,实际上没有(但是视频里说常用~~)“的可能性。毕竟人家博客没提到这个例子,没说到有交换的用法。
但是具体SWP有没有数据交换这个用法,是不是不能拆解成LDR和STR,是不是他们两者都有问题,,他们说了不算,我说了也不算。只能去验证,
PS:又查了些资料,应该是有SWP R0,R0,[R1]的交换用法,而且都是用的”同时“这个字眼,这种时刻我们应该找到英文原版,看看”同时“是哪个词,不过从逻辑上应该是严格的”同时“,而不是”然后“,
附1:摘自某blog http://blog.csdn.net/dragon101788/article/details/7989658
-------------------------------------------------------------------------------------------------------------------
swp指令:
语法: <swp><b/h> Rd, Rm, [rn]
swp指令执行单字节或单字的内存于寄存器的数据交换原子操作。把rn所指内存里面的值赋值给Rd, 然后把R1存入R2所指的内存。经常用于内核中实现控制互斥与信号等功能。
例如:
swp r0, r1,[r2] :表示把r2所指的内存地址里面的值赋值给r0, 然后把r1存入r2所指内存地址。相当于下面2条指令的原子操作。
ldr r0, [r2]
str r1, [r2]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SWP R0,R1,[R2]
有文字“同时将R1中的数据存到R2所指的内存中“,或许”同时“也表达了”然后“?(文字这东西~意思太多),但是要想合乎逻辑,我姑且理解”同时“这个字眼有不计顺序同时完成的意思吧。
但是做视频的人自己给SWP指令解读出了先后顺序,还给画了箭头和小标号——也就是先R2指向的内存中的内容先存到R0,再把R1中的数据存到R2指向的内存中。
讽刺的是,这段文字包含了两个例子
第二个例子:
SWP R0,R0,[R1]
可以完成R0和R1指向的存储器中的数据的交换,这就搞笑了,你先把R1指向的数据读到R0,再从R0把R1指向的内存内容复制回该内存,多此一举,明显的要丢失R0数据了。
所以我暂时认为他讲的是错的(国嵌视频师综合素质比较低,对计算机方面基础知识的掌握和基本的读英文单词的能力欠佳。但是实践部分——作为手把手教你摸板子的启蒙,还有很有价值的。而且视频中讲师不光自己臆断出第一步和第二步,还给学生强化洗脑,让他们回答第一步是什么第二步是什么,看来不去培训班是对的。我看国嵌也是买飞凌6410送的做参考)
只能暂时认为他是”同时的“,具体内部怎么同时,暂时没掌握验证方法,先做计划:
方法一:看指令能否拆解成更小的指令,里边有没有用一个其他寄存器做temp——这就说的通了。
方法二:查资料——巧的是,网上搜一下,也有这种谬论,将”同时“解读为先后,还把这个谬论发扬壮大了,把模棱两可的”同时“直接写成了”然后“,更煞有介事的把指令拆解成了ldr和str,,见附1。真是不可原谅,你再没有逻辑,有点实践有点C基础的人也知道交换要有个temp吧,你直接用A=B;B=A;这种语句能做交换么?[b]所以我暂时认为他的博客也是错的[/b]
方法三:跟CPU时序(或者叫指令时序?计算机组成原理的基础给忘了)有关,细分就是里边有类似于X、Y这种寄存器来做temp——有点需要基础,这种解释比较靠谱,但是现在的阶段是要自己用板子去验证,主要还看ARM的原子操作自己究竟能验证接触到多么”原子“的程度。
留个后路:为了保持逻辑上的无懈可击,不因为我自己的一个误解把他俩都一棒子打死。我保留”国嵌视频中第二个例子SWP R0,R0,[R1] 是他们杜撰的用法,实际上没有(但是视频里说常用~~)“的可能性。毕竟人家博客没提到这个例子,没说到有交换的用法。
但是具体SWP有没有数据交换这个用法,是不是不能拆解成LDR和STR,是不是他们两者都有问题,,他们说了不算,我说了也不算。只能去验证,
PS:又查了些资料,应该是有SWP R0,R0,[R1]的交换用法,而且都是用的”同时“这个字眼,这种时刻我们应该找到英文原版,看看”同时“是哪个词,不过从逻辑上应该是严格的”同时“,而不是”然后“,
附1:摘自某blog http://blog.csdn.net/dragon101788/article/details/7989658
-------------------------------------------------------------------------------------------------------------------
swp指令:
语法: <swp><b/h> Rd, Rm, [rn]
swp指令执行单字节或单字的内存于寄存器的数据交换原子操作。把rn所指内存里面的值赋值给Rd, 然后把R1存入R2所指的内存。经常用于内核中实现控制互斥与信号等功能。
例如:
swp r0, r1,[r2] :表示把r2所指的内存地址里面的值赋值给r0, 然后把r1存入r2所指内存地址。相当于下面2条指令的原子操作。
ldr r0, [r2]
str r1, [r2]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
相关文章推荐
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 【jQuery学习笔记】关于jQuery1.6.1版的ajaxstart不执行问题解决方案
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 菜鸟学习嵌入式 问题笔记之 关于-/bin/sh: 命令:not found的解决办法
- 菜鸟学习嵌入式 问题笔记之 关于-/bin/sh: 命令:not found的解决办法
- 关于继承构造函数执行顺序、override及new如何执行的学习笔记
- 关于SQLServer2005的学习笔记——多触发器执行问题
- JS学习笔记(五):关于$(function(){});里面的函数不执行问题
- 关于SQLServer2005的学习笔记——多触发器执行问题
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- ARM学习笔记4——加载存储指令
- 关于初学ASP.NET技术的学习顺序问题
- 关于Android SQLite3多线程并发问题,学习笔记。
- 学习笔记-----关于VS中使用模板类出现无法解析的外部符号问题
- 关于js在html中执行顺序的问题
- 关于学习嵌入式的一点问题
- 关于try中含有return语句的执行顺序的升入解析(学习javap命令)
- TQ2440 学习笔记—— 9、嵌入式编程基础知识【arm-linux-gcc 选项】
- TQ2440 学习笔记—— 10、嵌入式编程基础知识【arm-linux-ld 选项】