原创 TMS320F28027流水线相关性操作

2010-10-16 21:10 2169 16 16 分类: 处理器与DSP

        以前在学习计算机体系结构时,还记得由于流水线的存在处理器指令会存在相关性问题,可是那时只记得应付考试去了,今天终于知道这一点的严重性了。


       最近在做一个DSp的项目,使用TMS320F28027,其中有这么几条语句


                                        .............


                                       GpioDataRegs.GPADAT.bit.GPIO3 = 1;
                                       GpioDataRegs.GPADAT.bit.GPIO4 = 1;


                                       .............


        在调试过程中,发现GPIO3在全速运行始终不是高电平,而在单步执行时又恢复正常,后来用示波器抓波形发现,全速执行时GPIO3会在执行到上述第一条语句是出现一个宽度大约116ns的高脉冲,之后就一直是低电平,百思不得其解。


        最后还是老师帮忙从手册里找到了这么几句:


     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-modify-write of GPADAT
                          GpioDataRegs.GPADAT.bit.GPIO2 = 1 ; I2 also a read-modify-write of GPADAT. ;It gets the oldvalue 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.


        原来TI早就知道有人会犯错,读后写会,第二次读的时候,第一次写的结果并没有使得外部引脚状态稳定,因此造成了资源相关,问题找到,一星期的郁闷终于结束。


        当然,TI也给出了两种解决方法,第一就是在两次赋值之间插入NOP语句,以使得第二句赋值等待第一句语句的结果稳定;第二是放弃使用GPADAT寄存器,而使用GPASET,GPACLEAR寄存器,进行引脚电瓶状态的改变。


        问题解决。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
16
关闭 站长推荐上一条 /3 下一条