CCS3。1和CCS2有什么区别

[复制链接]
4142|2
 楼主| phoenixmy 发表于 2007-1-24 13:29 | 显示全部楼层 |阅读模式
<br /><br />CCS2的代码优化真是个严重问题,CCS3。1是否在这个方面做过改进??<br />
 楼主| phoenixmy 发表于 2007-1-24 21:27 | 显示全部楼层

好冷清~~~~~~~~~~~~

好不容易改好了一小段代码,发现用O3级优化后,被CCS已经整的面目全非。。。。。。<br />&nbsp;<br />例子代码如下:<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;6;&nbsp;i&nbsp;++)&nbsp;{//6路报号命令分析及处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(NumberBufferLen&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;128;&nbsp;j&nbsp;++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SndBuffer[i&nbsp;+&nbsp;2][j&nbsp;+&nbsp;k]&nbsp;=&nbsp;0xd5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberBufferPos&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;int&nbsp;*)(0x811d&nbsp;+&nbsp;i&nbsp;*&nbsp;0x20))&nbsp;=&nbsp;0x6655;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flash.PageRead(GetNumberPlayPos(i),&nbsp;128,&nbsp;i&nbsp;+&nbsp;2,&nbsp;k);//<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;FlashReadFlag&nbsp;=&nbsp;0;//禁止读出数据&nbsp;<br />&nbsp;<br />&nbsp;<br />就这么简单的代码却始终无法正确运行,原因也很奇怪:<br />&nbsp;<br />首先,局部变量i,j都必须加&nbsp;volatile,防止优化<br />&nbsp;<br />volatile&nbsp;unsigned&nbsp;int&nbsp;i,&nbsp;j;//***********************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果不这样,i&nbsp;,&nbsp;j的值会在后面的Flash.PageRead函数里变的不确定,我在<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;实验中就发现i居然变成了10362<br />&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;6;&nbsp;i&nbsp;++)&nbsp;{//6路报号命令分析及处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(NumberBufferLen&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;128;&nbsp;j&nbsp;++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SndBuffer[i&nbsp;+&nbsp;2][j&nbsp;+&nbsp;k]&nbsp;=&nbsp;0xd5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberBufferPos&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;int&nbsp;*)(0x811d&nbsp;+&nbsp;i&nbsp;*&nbsp;0x20))&nbsp;=&nbsp;0x6655;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flash.PageRead(GetNumberPlayPos(i),&nbsp;128,&nbsp;i&nbsp;+&nbsp;2,&nbsp;k);//进入到此函数后进行单步调试,居然i变成了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//10362!!!!!<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;nop&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;FlashReadFlag&nbsp;=&nbsp;0;//禁止读出数据&nbsp;<br />&nbsp;<br />查阅资料,发现了下面的一段话:::::<br />&nbsp;<br />Figure&nbsp;3–1.&nbsp;Compiling&nbsp;a&nbsp;C&nbsp;Program&nbsp;With&nbsp;the&nbsp;Optimizer<br />C&nbsp;source<br />file&nbsp;(.c)<br />Code<br />generator<br />Parser&nbsp;Optimizer<br />.asm&nbsp;file<br />The&nbsp;easiest&nbsp;way&nbsp;to&nbsp;invoke&nbsp;the&nbsp;optimizer&nbsp;is&nbsp;to&nbsp;use&nbsp;the&nbsp;cl500&nbsp;shell&nbsp;program,<br />specifying&nbsp;the&nbsp;–on&nbsp;option&nbsp;on&nbsp;the&nbsp;cl500&nbsp;command&nbsp;line.&nbsp;The&nbsp;n&nbsp;denotes&nbsp;the&nbsp;level<br />of&nbsp;optimization&nbsp;(0,&nbsp;1,&nbsp;2,&nbsp;and&nbsp;3),&nbsp;which&nbsp;controls&nbsp;the&nbsp;type&nbsp;and&nbsp;degree&nbsp;of&nbsp;optimization:<br />&nbsp;–o0<br />&nbsp;Performs&nbsp;control-flow-graph&nbsp;simplification<br />&nbsp;Allocates&nbsp;variables&nbsp;to&nbsp;registers<br />&nbsp;Performs&nbsp;loop&nbsp;rotation<br />&nbsp;Eliminates&nbsp;unused&nbsp;code<br />&nbsp;Simplifies&nbsp;expressions&nbsp;and&nbsp;statements<br />&nbsp;Expands&nbsp;calls&nbsp;to&nbsp;functions&nbsp;declared&nbsp;inline<br />&nbsp;–o1<br />Performs&nbsp;all&nbsp;–o0&nbsp;optimizations,&nbsp;plus:<br />&nbsp;Performs&nbsp;local&nbsp;copy/constant&nbsp;propagation<br />&nbsp;Removes&nbsp;unused&nbsp;assignments<br />&nbsp;Eliminates&nbsp;local&nbsp;common&nbsp;expressions<br />&nbsp;–o2<br />Performs&nbsp;all&nbsp;–o1&nbsp;optimizations,&nbsp;plus:<br />&nbsp;Performs&nbsp;loop&nbsp;optimizations<br />&nbsp;Eliminates&nbsp;global&nbsp;common&nbsp;subexpressions<br />&nbsp;Eliminates&nbsp;global&nbsp;unused&nbsp;assignments<br />&nbsp;Performs&nbsp;loop&nbsp;unrolling<br />The&nbsp;optimizer&nbsp;uses&nbsp;–o2&nbsp;as&nbsp;the&nbsp;default&nbsp;if&nbsp;you&nbsp;use&nbsp;–o&nbsp;without&nbsp;an&nbsp;optimization<br />level.<br />&nbsp;–o3<br />Performs&nbsp;all&nbsp;–o2&nbsp;optimizations,&nbsp;plus:<br />&nbsp;Removes&nbsp;all&nbsp;functions&nbsp;that&nbsp;are&nbsp;never&nbsp;called<br />&nbsp;Simplifies&nbsp;functions&nbsp;with&nbsp;return&nbsp;values&nbsp;that&nbsp;are&nbsp;never&nbsp;used<br />&nbsp;Inlines&nbsp;calls&nbsp;to&nbsp;small&nbsp;functions<br />&nbsp;Reorders&nbsp;function&nbsp;declarations&nbsp;so&nbsp;that&nbsp;the&nbsp;attributes&nbsp;of&nbsp;called<br />functions&nbsp;are&nbsp;known&nbsp;when&nbsp;the&nbsp;caller&nbsp;is&nbsp;optimized<br />&nbsp;Identifies&nbsp;file-level&nbsp;variable&nbsp;characteristics<br />&nbsp;<br />&nbsp;<br />接着看下面的**,似乎也没有提到在循环或者分支子函数中,中间变量会自动变化这一情况,<br />个人认为,因为还在大循环中,所以中间变量应该压栈,此时如果调用子函数,那么变量应该是不会<br />自己随意变化的。<br />&nbsp;<br />看来只能是再研究研究看了。。。。。。。。。。。。。。<br />
hotpower 发表于 2007-1-24 21:32 | 显示全部楼层

关注之中,不知CCS3.1以后会如何~~~

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

本版积分规则

188

主题

3955

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部