您的位置:首页 > 其它

嵌入式学习笔记--关于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]

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐