打印

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

[复制链接]
3962|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 关键亲兄弟用的是和谐版

使用特权

评论回复
5
ayb_ice| | 2011-11-30 08:11 | 只看该作者
backcount = temp2*temp1;

backcount = backcount*2;

backcount = backcount+2

难道LZ没有发现第一句话其实没有实际作用吗

使用特权

评论回复
6
hotpower| | 2011-11-30 08:46 | 只看该作者
晕,32位机搞8位变量,乘法不考虑溢出问题?倒塌了。

使用特权

评论回复
7
Ryanhsiung|  楼主 | 2011-11-30 11:39 | 只看该作者
6# hotpower 这个不用担心,参与运算的值很小,我要的结果只要8位的!

使用特权

评论回复
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局部变量显示正确

使用特权

评论回复
9
delin17| | 2011-11-30 12:19 | 只看该作者

..

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

局部变量,运算完后不用,自动被优化掉了..
他的作用域内,你运算完后就把他抛弃。所以你的运算是没意义的,因此会被优化掉。
但你用静态变量,他的运算会对第二次运算产生作用,所以你的运算是有意义的,因些不会被优化掉。

使用特权

评论回复
10
hotpower| | 2011-11-30 13:48 | 只看该作者
如此节约,那就该两数乘积加一后再加倍

使用特权

评论回复
11
jack821119| | 2011-11-30 16:16 | 只看该作者
优化等级惹的祸。

使用特权

评论回复
12
joinj| | 2011-11-30 19:03 | 只看该作者
重装KEIL   会有意外收获·····前提要清理干净残留····

使用特权

评论回复
13
Ryanhsiung|  楼主 | 2011-12-1 07:54 | 只看该作者
重装KEIL   会有意外收获·····前提要清理干净残留····
joinj 发表于 2011-11-30 19:03

不想重装!麻烦

使用特权

评论回复
14
Ryanhsiung|  楼主 | 2011-12-1 07:55 | 只看该作者
11# jack821119 应该不是优化

使用特权

评论回复
15
Ryanhsiung|  楼主 | 2011-12-1 07:57 | 只看该作者
10# hotpower 不是节约,只是个串口传送中用的的数量单位,就只有8位!
  若+1*2,虽然节省空间,提高效率,但是逻辑上就与愿意不一样,还是*2+1的好!

使用特权

评论回复
16
fe07fe| | 2012-1-11 23:28 | 只看该作者
本帖最后由 fe07fe 于 2012-1-11 23:31 编辑

temp1 =*(command++);
我还以为是c指针,很像的吧!
怎么像乘法,谁能解释吗!

使用特权

评论回复
17
Ryanhsiung|  楼主 | 2012-1-12 08:19 | 只看该作者
temp1 =*(command++);
我还以为是c指针,很像的吧!
怎么像乘法,谁能解释吗!
fe07fe 发表于 2012-1-11 23:28


乘法是temp1 *=(command++);  这才是

使用特权

评论回复
18
zhaoyu2005| | 2012-1-12 09:49 | 只看该作者
mdk现在的仿真不如以前keil了,看到的变量值乱七八糟,实际是对的

使用特权

评论回复
19
xiaomuhong26| | 2012-1-12 18:38 | 只看该作者
LZ,到底是什么造成的呢?找到原因了吗?

使用特权

评论回复
20
handlike| | 2012-1-12 21:14 | 只看该作者
我也发现8楼所说的现象,仿真看到的不一定是真实的。
楼主计算的结果没有给更后面的应用到,给优化的可能性更大些。

使用特权

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

本版积分规则

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

64

主题

4653

帖子

14

粉丝