打印

关于代码优化选项的疑问?

[复制链接]
2006|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
moron1984|  楼主 | 2011-3-29 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
debug的工程下面默认的优化选项是low,当我调试完成之后我用release编译之后发现优化选项是high,造成执行的结果不正确。后来在debug中加入优化选项,发现编译器把一部分代码优化掉了
我的代码如下:

  commandcount = 0;
  while( Command[ COMMAND_AREA_SIZE - 1 ] != COMMAND_FIN_CODE )
  {  
     if(commandcount > COMMANDTimOUT )
      {
        restore = ON;
        RestoreCommand( );
        break;
      }
  }
  if(restore == OFF )
    StoreCommand( );

Command是在通信中断中改变的,在主程序中判断,commandcount 是超时计数,如果超时就退出,没有优化的时候是正常执行。
如果优化过后,变成把Command[ COMMAND_AREA_SIZE - 1 ]的值付给R0,一直在对R0做比较,结果程序进入死循环。
优化的选项是
Common subexpression elimination 和 Code motion
问下版主怎么避免这种现象,就是说这种共有变量的情况怎么可以不优化。我的意思就是说,在选中优化选项的同时,怎么避免这种执行结果不对的情况
沙发
moron1984|  楼主 | 2011-3-30 08:40 | 只看该作者
没人吗?比较急啊,不知道如何解决这个问题~~希望各位高手帮忙解决

使用特权

评论回复
板凳
airwill| | 2011-3-30 12:41 | 只看该作者
用 volatile 申明 Command 变量. 通常 主循环和中断变量共享的变量, 都应该这样处理.

使用特权

评论回复
地板
Chaos_zc| | 2011-8-6 01:18 | 只看该作者
申明时声明成volatile类型,表示该变量的值随时可能会被外部或硬件改变。编译器会编译成:每次用这个变量时要重新去读存储该数据的地址。否则编译器会编译成:只在第一次用时读一次该值,之后再用到该变量就用这个值代替以提高运行速度。

使用特权

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

本版积分规则

0

主题

13

帖子

0

粉丝