最近遇到一个很奇怪的现象,不知如何解决。指针赋值例如*p=20要比变量赋值a=20花费的时间长好几十倍。
我在CCS5.5里面新建一个sysbios的工程,然后做了如下测试代码:
int test;
int *pda;
long long t1,t2,t3,t4,tover,tdelt1,tdelt2;
Int main()
{
pda= &test;
TSCH=0;
TSCL=0;
t1 = _itoll (TSCH, TSCL);
*pda = 30;
t2 = _itoll (TSCH, TSCL);
tdelt1 = t2-t1;
return 0;
}
此时的tdelt1 的值调试发现是307,也就是一个指针赋值*pda = 30 花费的307个指令周期。这也太长了。查看了它的汇编代码也没异常,如下:
27 t1 = _itoll (TSCH, TSCL);
c30025c4: 02A803E2 MVC.S2 TSCL,B5
c30025c8: 022C03E2 MVC.S2 TSCH,B4
c30025cc: 0280047E STW.D2T2 B5,*+B14[4]
c30025d0: 0200057E STW.D2T2 B4,*+B14[5]
28 *pda = 30;
c30025d4: 0200026E LDW.D2T2 *+B14[2],B4
c30025d8: DA93 MVK.S2 30,B5
c30025da: 4C6E NOP 3
c30025dc: E8000000 .fphead n, l, W, BU, nobr, nosat, 1000000
c30025e0: 029002F6 STW.D2T2 B5,*+B4[0]
29 t2 = _itoll (TSCH, TSCL);
c30025e4: 02A803E2 MVC.S2 TSCL,B5
c30025e8: 022C03E2 MVC.S2 TSCH,B4
c30025ec: 0280067E STW.D2T2 B5,*+B14[6]
c30025f0: 0200077E STW.D2T2 B4,*+B14[7]
30 tdelt1 = t2-t1;
c30025f4: 0300056E LDW.D2T2 *+B14[5],B6
c30025f8: 0200046E LDW.D2T2 *+B14[4],B4
c30025fc: 0380076E LDW.D2T2 *+B14[7],B7
c3002600: 00004000 NOP 3
c3002604: 0210A5FA SUBU.L2 B5,B4,B5:B4
c3002608: CAE3 EXT.S2 B5,24,24,B6
c300260a: EB51 || SUB.L2 B7,B6,B5
c300260c: 02000E7F STW.D2T2 B4,*+B14[14]
c3002610: 0218A07A || ADD.L2 B5,B6,B4
以上是它的汇编语句。没有发现异常,而我此时将测试代码中*pda = 30这句改成test =30;也就是直接变量赋值,如下:
int test;
int *pda;
long long t1,t2,t3,t4,tover,tdelt1,tdelt2;
Int main()
{
pda= &test;
TSCH=0;
TSCL=0;
t1 = _itoll (TSCH, TSCL);
test = 30;
t2 = _itoll (TSCH, TSCL);
tdelt1 = t2-t1;
return 0;
}
此时调试发现tdelt1的值是6,也就是直接变量赋值花费的只有6个指令周期。这个差距也太大了。这里变量赋值的汇编语句是这样的:
27 t1 = _itoll (TSCH, TSCL);
c30025bc: 02A803E2 MVC.S2 TSCL,B5
c30025c0: 022C03E2 MVC.S2 TSCH,B4
c30025c4: 0280047E STW.D2T2 B5,*+B14[4]
c30025c8: 0200057E STW.D2T2 B4,*+B14[5]
28 test = 30;
c30025cc: 01800F28 MVK.S1 0x001e,A3
c30025d0: 0180017C STW.D2T1 A3,*+B14[1]
29 t2 = _itoll (TSCH, TSCL);
c30025d4: 02A803E2 MVC.S2 TSCL,B5
c30025d8: 022C03E2 MVC.S2 TSCH,B4
c30025dc: 0280067E STW.D2T2 B5,*+B14[6]
c30025e0: 0200077E STW.D2T2 B4,*+B14[7]
30 tdelt1 = t2-t1;
c30025e4: 0300056E LDW.D2T2 *+B14[5],B6
c30025e8: 0200046E LDW.D2T2 *+B14[4],B4
c30025ec: 0380076E LDW.D2T2 *+B14[7],B7
c30025f0: 00004000 NOP 3
c30025f4: 0210A5FA SUBU.L2 B5,B4,B5:B4
c30025f8: CAE3 EXT.S2 B5,24,24,B6
c30025fa: EB51 || SUB.L2 B7,B6,B5
c30025fc: E8001000 .fphead n, l, W, BU, nobr, nosat, 1000000
c3002600: 02000E7F STW.D2T2 B4,*+B14[14]
对此,不能理解,为何使用指针赋值时要花费这么长的时间,而变量赋值就这么短,这样下去指针都不能用了,请哪位大侠帮忙分析一下,是什么原因呢。?
