关于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 不是常用量,是易变量,如端口。处理时不做一些默认优化。