又见KEIL灵异事件!大侠进来解释一下!!

[复制链接]
 楼主| Ryanhsiung 发表于 2011-11-29 16:58 | 显示全部楼层 |阅读模式
keil, TE, AC, ck, ic
本帖最后由 Ryanhsiung 于 2011-11-29 16:59 编辑

//定义临时变量则最后结果为0
uint8_t temp1,temp2;
uint8_t backcount,i,j;
//定义写为STATIC 正常
static uint8_t temp1,temp2;
static uint8_t backcount,i,j;

//以下为运算

     temp1 =*(command++);// 赋值2
     temp2 =*(command);// 赋值4

backcount= 0;
//原本只有一句,现被我拆成好几句了

backcount = temp2*temp1;

backcount = backcount*2;

backcount = backcount+2
;
若参与运算的变量都为临时变量则backcount最后的结果为0,
只要将参与运算的变量改为STATIC就正常了!!
断点DEBUG,临时变量TEMP1 TEMP2是对的!!


使用系统:KEIL4.12 新唐NUC100单片机
 楼主| Ryanhsiung 发表于 2011-11-29 17:06 | 显示全部楼层
变量定义太多了??   应该不会啊
w522930954 发表于 2011-11-29 17:24 | 显示全部楼层
你在程序的其他地方更改过变量吧。
RyanHsuing 发表于 2011-11-29 17:48 | 显示全部楼层
找到原因了,实际是对的就是LOCAL显示不对!
   很怪,TEMP1,TEMP2,I,J都可以显示正常!就那个变量显示不对!

不过也不能怪KEIL 关键亲兄弟用的是和谐版
ayb_ice 发表于 2011-11-30 08:11 | 显示全部楼层
backcount = temp2*temp1;

backcount = backcount*2;

backcount = backcount+2

难道LZ没有发现第一句话其实没有实际作用吗
hotpower 发表于 2011-11-30 08:46 | 显示全部楼层
晕,32位机搞8位变量,乘法不考虑溢出问题?倒塌了。
 楼主| Ryanhsiung 发表于 2011-11-30 11:39 | 显示全部楼层
6# hotpower 这个不用担心,参与运算的值很小,我要的结果只要8位的!
 楼主| Ryanhsiung 发表于 2011-11-30 11:40 | 显示全部楼层
backcount = temp2*temp1;

backcount = backcount*2;

backcount = backcount+2

难道LZ没有发现第一句话其实没有实际作用吗
ayb_ice 发表于 2011-11-30 08:11

都有作用,
只是KEIL的问题,没有将backcount局部变量显示正确
delin17 发表于 2011-11-30 12:19 | 显示全部楼层

..

本帖最后由 delin17 于 2011-11-30 12:21 编辑

局部变量,运算完后不用,自动被优化掉了..
他的作用域内,你运算完后就把他抛弃。所以你的运算是没意义的,因此会被优化掉。
但你用静态变量,他的运算会对第二次运算产生作用,所以你的运算是有意义的,因些不会被优化掉。
hotpower 发表于 2011-11-30 13:48 | 显示全部楼层
如此节约,那就该两数乘积加一后再加倍
jack821119 发表于 2011-11-30 16:16 | 显示全部楼层
优化等级惹的祸。
joinj 发表于 2011-11-30 19:03 | 显示全部楼层
重装KEIL   会有意外收获·····前提要清理干净残留····
 楼主| Ryanhsiung 发表于 2011-12-1 07:54 | 显示全部楼层
重装KEIL   会有意外收获·····前提要清理干净残留····
joinj 发表于 2011-11-30 19:03

不想重装!麻烦
 楼主| Ryanhsiung 发表于 2011-12-1 07:55 | 显示全部楼层
11# jack821119 应该不是优化
 楼主| Ryanhsiung 发表于 2011-12-1 07:57 | 显示全部楼层
10# hotpower 不是节约,只是个串口传送中用的的数量单位,就只有8位!
  若+1*2,虽然节省空间,提高效率,但是逻辑上就与愿意不一样,还是*2+1的好!
fe07fe 发表于 2012-1-11 23:28 | 显示全部楼层
本帖最后由 fe07fe 于 2012-1-11 23:31 编辑

temp1 =*(command++);
我还以为是c指针,很像的吧!
怎么像乘法,谁能解释吗!
 楼主| Ryanhsiung 发表于 2012-1-12 08:19 | 显示全部楼层
temp1 =*(command++);
我还以为是c指针,很像的吧!
怎么像乘法,谁能解释吗!
fe07fe 发表于 2012-1-11 23:28


乘法是temp1 *=(command++);  这才是
zhaoyu2005 发表于 2012-1-12 09:49 | 显示全部楼层
mdk现在的仿真不如以前keil了,看到的变量值乱七八糟,实际是对的
xiaomuhong26 发表于 2012-1-12 18:38 | 显示全部楼层
LZ,到底是什么造成的呢?找到原因了吗?
handlike 发表于 2012-1-12 21:14 | 显示全部楼层
我也发现8楼所说的现象,仿真看到的不一定是真实的。
楼主计算的结果没有给更后面的应用到,给优化的可能性更大些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4653

帖子

14

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