4787|6

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

KEIL C 编译器出现部分语句不编译的情况,求助原因? [复制链接]

#define        SBUFLENS        21
uchar        ArraySPSData [SBUFLENS];                        // data to be send to server
......
void main(void)
{
        ......
        ArraySPSData[0] = 5;
        ArraySPSData[1] = (0xF0 | MachineId);
        ArraySPSData[2] = 3;
        ArraySPSData[3] = 0x80;
        ArraySPSData[4] = MachineId;
                                                                       
        ArraySPSData[5] = ArraySPSData[2];
        for (i=3; i<5; i++)
        {
                ArraySPSData[5] ^= ArraySPSData;  //异或
        }
        ArraySPSData[5] &= 0x7F;          //这条语句不编译,无法运行
        ......
        if (ArrayBarcBuf[0] > 0)
        {
                ArraySPSData[0] = 19;
                ArraySPSData[1] = (0xF0 | MachineId);
                ArraySPSData[2] = 17;
                ArraySPSData[3] = 0x80;
                ArraySPSData[4] = MachineId;
                                                                               
                for (i=5; i<19; i++)
                {
                        ArraySPSData = ArrayBarcBuf[i-3];
                }
                                                                               
                ArraySPSData[19] = ArraySPSData[2];
                for (i=3; i<19; i++)
                {
                        ArraySPSData[19] ^= ArraySPSData;  //异或
                }
                ArraySPSData[19] &= 0x7F;       //这句话没问题,编译了且有效执行了。
        }
}

百思不得其解的就是,同样的语句为什么会有的编译,有的不编译?而且在编译过程中一点错误提示都没有,只有在运行时发现,有些语句就是不执行,仔细查看才发现,压根就没编译,这是什么原因造成的?

最新回复

应该是优化掉了  详情 回复 发表于 2009-4-7 17:36
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
编译结果如下:(怎么就是不编译啊?)
  1079:                                                 {
  1080:                                                         ArraySPSData[0] = 19;
C:0x0197    754F13   MOV      ArraySPSData(0x4F),#0x13
  1081:                                                         ArraySPSData[1] = (0xF0 | MachineId);
C:0x019A    E51F     MOV      A,MachineId(0x1F)
C:0x019C    44F0     ORL      A,#B(0xF0)
C:0x019E    F550     MOV      0x50,A
  1082:                                                         ArraySPSData[2] = 17;
C:0x01A0    755111   MOV      0x51,#0x11
  1083:                                                         ArraySPSData[3] = 0x80;
C:0x01A3    755280   MOV      0x52,#P0(0x80)
  1084:                                                         ArraySPSData[4] = MachineId;
  1085:                                                                                 
C:0x01A6    851F53   MOV      0x53,MachineId(0x1F)
  1086:                                                         for (i=5; i<19; i++)
C:0x01A9    750805   MOV      0x08,#0x05
  1087:                                                         {
  1088:                                                                   ArraySPSData = ArrayBarcBuf[i-3];
C:0x01AC    7461     MOV      A,#0x61
C:0x01AE    2508     ADD      A,0x08
C:0x01B0    F8       MOV      R0,A
C:0x01B1    E6       MOV      A,@R0
C:0x01B2    FF       MOV      R7,A
C:0x01B3    744F     MOV      A,#ArraySPSData(0x4F)
C:0x01B5    2508     ADD      A,0x08
C:0x01B7    F8       MOV      R0,A
C:0x01B8    A607     MOV      @R0,0x07
  1089:                                                          }
  1090:                                                                                 
C:0x01BA    0508     INC      0x08
C:0x01BC    E508     MOV      A,0x08
C:0x01BE    B413EB   CJNE     A,#0x13,C:01AC
  1091:                                                          ArraySPSData[19] = ArraySPSData[2];
C:0x01C1    855162   MOV      0x62,0x51
  1092:                                                          for (i=3; i<19; i++)
C:0x01C4    750803   MOV      0x08,#0x03
  1093:                                                          {
  1094:                                                                   ArraySPSData[19] ^= ArraySPSData;//异或
C:0x01C7    744F     MOV      A,#ArraySPSData(0x4F)
C:0x01C9    2508     ADD      A,0x08
C:0x01CB    F8       MOV      R0,A
C:0x01CC    E6       MOV      A,@R0
C:0x01CD    6262     XRL      0x62,A
  1095:                                                          }
C:0x01CF    0508     INC      0x08
C:0x01D1    E508     MOV      A,0x08
C:0x01D3    B413F1   CJNE     A,#0x13,C:01C7
  1096:                                                          ArraySPSData[19] &= 0x7F;
C:0x01D6    53627F   ANL      0x62,#0x7F
  1097:                                                 }
  1098:                                                 else
C:0x01D9    020341   LJMP     C:0341
  1099:                                                 {
  1100:                                                          ArraySPSData[0] = 5;
C:0x01DC    754F05   MOV      ArraySPSData(0x4F),#0x05
  1101:                                                          ArraySPSData[1] = (0xF0 | MachineId);
C:0x01DF    E51F     MOV      A,MachineId(0x1F)
C:0x01E1    44F0     ORL      A,#B(0xF0)
C:0x01E3    F550     MOV      0x50,A
  1102:                                                          ArraySPSData[2] = 3;
C:0x01E5    755103   MOV      0x51,#0x03
  1103:                                                          ArraySPSData[3] = 0x80;
C:0x01E8    755280   MOV      0x52,#P0(0x80)
  1104:                                                          ArraySPSData[4] = MachineId;
  1105:                                                                          
C:0x01EB    851F53   MOV      0x53,MachineId(0x1F)
  1106:                                                          ArraySPSData[5] = ArraySPSData[2];
C:0x01EE    855154   MOV      0x54,0x51
  1107:                                                          for (i=3; i<5; i++)
C:0x01F1    750803   MOV      0x08,#0x03
  1108:                                                          {
  1109:                                                                 ArraySPSData[5] ^= ArraySPSData; //异或
C:0x01F4    744F     MOV      A,#ArraySPSData(0x4F)
C:0x01F6    2508     ADD      A,0x08
C:0x01F8    F8       MOV      R0,A
C:0x01F9    E6       MOV      A,@R0
C:0x01FA    6254     XRL      0x54,A
  1110:                                                          }
C:0x01FC    0508     INC      0x08
C:0x01FE    E508     MOV      A,0x08
C:0x0200    B405F1   CJNE     A,#0x05,C:01F4
  1111:                                                      ArraySPSData[5] &= 0x7F;                 
  1112:                                                 }
  1113:                                            }                     
  1114:                                                                  
  1115:                                            break;
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
看看编译器的优化等级~
有可能优化掉了
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

4
 
引用 2 楼 friendfish 的回复:
看看编译器的优化等级~
有可能优化掉了


这位兄台,能说的详细些么?怎么查看优化等级呢?谢谢
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
是优化掉了,你在给ArraySPSData[5]做了位与运算后的结果没有被其他函数或进程调用,C51在编译的时候会认为它是没有用的。

优化等级你可以在"options for target"-->"C51"-->"Code Optimatization"中查看。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 viyao 的回复:
是优化掉了,你在给ArraySPSData[5]做了位与运算后的结果没有被其他函数或进程调用,C51在编译的时候会认为它是没有用的。

优化等级你可以在"options for target"-->"C51"-->"Code Optimatization"中查看。


调用是肯定调用过了的,呵呵.后面还有发送函数,只是没贴出来哈,不好意思.
还要请教兄台,还有什么原因会导致被优化掉呢?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
应该是优化掉了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表