当前位置: 代码迷 >> 单片机 >> 关于C51奇怪的有关问题
  详细解决方案

关于C51奇怪的有关问题

热度:94   发布时间:2016-04-28 16:21:04.0
关于C51奇怪的问题
我用keil的软件仿真运行如下代码

void   main
{
    unsigned   int   t;

    t   =   0x8000   +   0x5555;
    *(unsigned   char   *)t   =   0xaa;
}

t   =   0x8000   +   0x5555这条语句不执行。只能执行*(unsigned   char   *)t   =   0xaa;
这是为什么?谢谢!

------解决方案--------------------
被编译器优化掉了。
------解决方案--------------------
void main
{
unsigned int t;

t = 0x8000 + 0x5555;
*(unsigned char *)t = 0xaa;
}

应该不是优化的问题吧
若被优化了,0xaa写到什么地方了

------解决方案--------------------
是语句t = 0x8000 + 0x5555;被优化了,不是t被优化掉了。
------解决方案--------------------
我大概猜到了你的目的,建议用XDATA宏。
------解决方案--------------------

用voliate 或者关闭优化...
------解决方案--------------------
zhuoyuesky(卓越) ( ) 信誉:100 Blog 2007-03-23 12:17:46 得分: 0


voliate是什么,如何使用,初学51。谢谢!

............................................
这个是说告诉编译器,该变量是经常使用的,一般会为这个做特殊物理,比如说放入CPU的缓存,以减小访问的代价,增加执行效率

------解决方案--------------------
volatile是告诉编译器不要试图优化该变量。
------解决方案--------------------
zhuoyuesky(卓越) ( ) 信誉:100 Blog 2007-03-23 12:17:46 得分: 0


voliate是什么,如何使用,初学51。谢谢!

............................................


这个是说告诉编译器,该变量是经常使用的,一般会为这个做特殊物理,比如说放入CPU的缓存,以减小访问的代价,增加执行效率

==================================================================

不要误导新网友!

------解决方案--------------------
> > t = 0x8000 + 0x5555这条语句不执行。只能执行*(unsigned char *)t = 0xaa;
这是为什么?谢谢!

编译器能将这一条语句优化掉!可能吗,智能到将一条正确而且并不是冗余的一条语句删掉.建议你看看程序其他地方有没有问题,或者关掉编译器重启试一下,这个问题最简单的办法是查看生成的对应汇编语言,看看有没有这条语句,没有那就是被优化掉了
------解决方案--------------------
voliate 不是常用量,是易变量,如端口。处理时不做一些默认优化。
  相关解决方案