打印

CCS3。1和CCS2有什么区别

[复制链接]
3190|2
手机看帖
扫描二维码
随时随地手机跟帖
沙发
phoenixmy|  楼主 | 2007-1-24 21:27 | 只看该作者

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

好不容易改好了一小段代码,发现用O3级优化后,被CCS已经整的面目全非。。。。。。
 
例子代码如下:
 
    for(int i = 0; i < 6; i ++) {//6路报号命令分析及处理
      if(NumberBufferLen == 0) {
        for(int j = 0; j < 128; j ++) {
          SndBuffer[i + 2][j + k] = 0xd5;        }
        NumberBufferPos = 0;
        *((unsigned int *)(0x811d + i * 0x20)) = 0x6655;//      }
      else {
        Flash.PageRead(GetNumberPlayPos(i), 128, i + 2, k);//

        asm(" nop");
        asm(" nop");
        asm(" nop");
        }
    }
    FlashReadFlag = 0;//禁止读出数据 
 
 
就这么简单的代码却始终无法正确运行,原因也很奇怪:
 
首先,局部变量i,j都必须加 volatile,防止优化
 
volatile unsigned int i, j;//***********************************************************
                                          //如果不这样,i , j的值会在后面的Flash.PageRead函数里变的不确定,我在
                                          // 实验中就发现i居然变成了10362
   for(i = 0; i < 6; i ++) {//6路报号命令分析及处理
      if(NumberBufferLen == 0) {
        for(j = 0; j < 128; j ++) {
          SndBuffer[i + 2][j + k] = 0xd5;        }
        NumberBufferPos = 0;
        *((unsigned int *)(0x811d + i * 0x20)) = 0x6655;//      }
      else {
        Flash.PageRead(GetNumberPlayPos(i), 128, i + 2, k);//进入到此函数后进行单步调试,居然i变成了
                                                                                                         //10362!!!!!

        asm(" nop");
        asm(" nop");
        asm(" nop");
        }
    }
    FlashReadFlag = 0;//禁止读出数据 
 
查阅资料,发现了下面的一段话:::::
 
Figure 3–1. Compiling a C Program With the Optimizer
C source
file (.c)
Code
generator
Parser Optimizer
.asm file
The easiest way to invoke the optimizer is to use the cl500 shell program,
specifying the –on option on the cl500 command line. The n denotes the level
of optimization (0, 1, 2, and 3), which controls the type and degree of optimization:
 –o0
 Performs control-flow-graph simplification
 Allocates variables to registers
 Performs loop rotation
 Eliminates unused code
 Simplifies expressions and statements
 Expands calls to functions declared inline
 –o1
Performs all –o0 optimizations, plus:
 Performs local copy/constant propagation
 Removes unused assignments
 Eliminates local common expressions
 –o2
Performs all –o1 optimizations, plus:
 Performs loop optimizations
 Eliminates global common subexpressions
 Eliminates global unused assignments
 Performs loop unrolling
The optimizer uses –o2 as the default if you use –o without an optimization
level.
 –o3
Performs all –o2 optimizations, plus:
 Removes all functions that are never called
 Simplifies functions with return values that are never used
 Inlines calls to small functions
 Reorders function declarations so that the attributes of called
functions are known when the caller is optimized
 Identifies file-level variable characteristics
 
 
接着看下面的**,似乎也没有提到在循环或者分支子函数中,中间变量会自动变化这一情况,
个人认为,因为还在大循环中,所以中间变量应该压栈,此时如果调用子函数,那么变量应该是不会
自己随意变化的。
 
看来只能是再研究研究看了。。。。。。。。。。。。。。

使用特权

评论回复
板凳
hotpower| | 2007-1-24 21:32 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

3955

帖子

0

粉丝