5786|9

56

帖子

0

TA的资源

一粒金砂(中级)

 

请问Read-modify-write到底是怎样的呢? [复制链接]

在看datasheet的时候看到GPIO的部分有这么一段话:
When using the GPxDAT register to change the level of an output pin, you should be cautious not to
accidentally change the level of another pin. For example, if you mean to change the output latch level
of GPIOA0 by writing to the GPADAT register bit 0, using a read-modify-write instruction. The problem
can occur if another I/O port A signal changes level between the read and the write stage of the
instruction. You can also change the state of that output latch. You can avoid this scenario by using
the GPxSET, GPxCLEAR, and GPxTOGGLE registers to load the output latch instead.

我在想改变一个GPIO口的值的话直接写不就行了吗?为什么还需要 read和modify呢。
为什么用GPxSET, GPxCLEAR, and GPxTOGGLE 就不会出现它说的那种错误发生呢?

最新回复

read-modify-write  的意思是告诉你,用先从GPADAT 读出来,然后做位与清0,然后再写到GPADAT 去。这至少要3条甚至更多指令,中间可能会被打断修改导致最后写回的GPADAT 出现错误。 用GPxSET, GPxCLEAR, and GPxTOGGLE 应该针对的是每一个bit的操作,不需要先读,再修改,后写的操作,SET,CLEAR,TOGGLE 分开之后是一个指令,中间不会被打断。   详情 回复 发表于 2015-9-29 11:31
 

回复
举报

888

帖子

3

TA的资源

五彩晶圆(初级)

 
你好;
      你这个是在什么平台 ?

点评

C2000。 芯片是TMS320F28335  详情 回复 发表于 2015-9-28 14:43
个人签名邮箱:ternence.hsu@foxmail.com
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

 
37°男人 发表于 2015-9-28 12:00
你好;
      你这个是在什么平台 ?

C2000。  芯片是TMS320F28335
 
 
 

回复

215

帖子

0

TA的资源

一粒金砂(高级)

 
感觉后面那段话能说明一些问题。
The GPxDAT registers reflect the state of the pin, not the latch. This means the register reflects the
actual pin value. However, there is a lag between when the register is written to when the new pin
value is reflected back in the register. This may pose a problem when this register is used in
subsequent program statements to alter the state of GPIO pins. An example is shown below where two
program statements attempt to drive two different GPIO pins that are currently low to a high state.
If Read-Modify-Write operations are used on the GPxDAT registers, because of the delay between the
output and the input of the first instruction (I1), the second instruction (I2) will read the old value and
write it back.
GpioDataRegs.GPADAT.bit.GPIO1 = 1 ; I1 performs read-modifywrite of GPADAT GpioDataRegs.GPADAT.bit.GPIO2 = 1 ; I2 also a read-modifywrite of GPADAT. ; It gets the old value of GPIO1 due to the delay
The second instruction will wait for the first to finish its write due to the write-followed-by-read
protection on this peripheral frame. There will be some lag, however, between the write of (I1) and the
GPxDAT bit reflecting the new value (1) on the pin. During this lag, the second instruction will read the
old value of GPIO1 (0) and write it back along with the new value of GPIO2 (1). Therefore, GPIO1 pin
stays low.
大概就是说这个核心是多级流水线的感觉。指令不是马上产生效果的意思。然后再在后面语句使用dat寄存器的话就会使用dat寄存器之前的值,就会出问题。所以后面他写的解决方法一就是插入一些NOP。以等待流水线操作完成。

点评

不过请问你是在哪个文档里看到的哦,我那个文档里没搜到你说的。能传一下吗  详情 回复 发表于 2015-9-28 19:30
不过请问你是在哪个文档里看到的哦,我那个文档里没搜到你说的。能传一下吗  详情 回复 发表于 2015-9-28 19:30
非常感谢。 在这个例子中就是说 GpioDataRegs.GPADAT.bit.GPIO2 = 1还没对GPxDAT起作用芯片就把上面的数据读了然后写了,所以GPIO2没变。  详情 回复 发表于 2015-9-28 19:29
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

 
a828378 发表于 2015-9-28 14:58
感觉后面那段话能说明一些问题。
The GPxDAT registers reflect the state of the pin, not the latch. Th ...

非常感谢。
在这个例子中就是说
GpioDataRegs.GPADAT.bit.GPIO2 = 1还没对GPxDAT起作用芯片就把上面的数据读了然后写了,所以GPIO2没变。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

 
a828378 发表于 2015-9-28 14:58
感觉后面那段话能说明一些问题。
The GPxDAT registers reflect the state of the pin, not the latch. Th ...

不过请问你是在哪个文档里看到的哦,我那个文档里没搜到你说的。能传一下吗
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

 
a828378 发表于 2015-9-28 14:58
感觉后面那段话能说明一些问题。
The GPxDAT registers reflect the state of the pin, not the latch. Th ...

不过请问你是在哪个文档里看到的哦,我那个文档里没搜到你说的。能传一下吗
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

 
因为GPxDAT需要一段时间将里面的数据反映到对应的pin上,所以这段时间相当于GPxDAT被锁存了,即使有修改GPIO2的指令,但是芯片不知道这时候对GPxDAT进行修改是不起作用的

点评

就是产品的Tech Reference book 里面。我把28069的传上来给你看看。第117页。我的理解是虽说dsp是单指令周期完成的。但是其实是六个周期+六级流水线。(具体c28x是不是六我就有点忘了,我记得cla是),然后比如第个  详情 回复 发表于 2015-9-28 20:06
 
 
 

回复

215

帖子

0

TA的资源

一粒金砂(高级)

 
无知的萝卜 发表于 2015-9-28 19:52
因为GPxDAT需要一段时间将里面的数据反映到对应的pin上,所以这段时间相当于GPxDAT被锁存了,即使有修改GPI ...

就是产品的Tech Reference book 里面。我把28069的传上来给你看看。第117页。我的理解是虽说dsp是单指令周期完成的。但是其实是六个周期+六级流水线。(具体c28x是不是六我就有点忘了,我记得cla是),然后比如第个改gpio1的时候可以改,但是实际是若干个周期之后(write环节)才实际上吧gpiodat寄存器更新了。但是在第二个周期的时候要改gpio2的时候就要先读取旧的gpiodat的数据(fetch)然而这一步实际上在write之前就做了。所以就是一个0了。然后就出了问题。
我大概是这么理解的。有错误欢迎指正。

TMS320x2806x Piccolo Technical Reference Guide .pdf

6.37 MB, 下载次数: 4

 
 
 

回复

6754

帖子

18

TA的资源

五彩晶圆(中级)

 
read-modify-write  的意思是告诉你,用先从GPADAT 读出来,然后做位与清0,然后再写到GPADAT 去。这至少要3条甚至更多指令,中间可能会被打断修改导致最后写回的GPADAT 出现错误。
用GPxSET, GPxCLEAR, and GPxTOGGLE 应该针对的是每一个bit的操作,不需要先读,再修改,后写的操作,SET,CLEAR,TOGGLE 分开之后是一个指令,中间不会被打断。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表