4
276
828
高级技术员
使用特权
222
1万
4万
技术总监
总结一点,就是禁止编译器优化 针对第二点:就是每次使用某个变量的值都要重新加载它的值,而不能使用先前备份的值(有时前面已经读出某个变量的值,并且被加载到某个变量中,下次使用时一定要重新从原变量加载) ... ayb_ice 发表于 2012-7-31 08:58
尽管你的话我理解,用大白话来说,就是编译器 处理有些数据 是放到了寄存器 有些是放固定内存。你的意思是用了volatile就放固定内存。 这个我知道啊。 但是似乎和解释第二点没啥关系。 ... misra 发表于 2012-7-31 09:05
21
800
2792
初级工程师
比如说 char flag = 0; main() { ............. if(flag == 1) { .................... } } interrupt() { if(...) { flag = 1; } } 这段程序看起来没问题,但是编译器可能自作聪明地认为flag == 0 ... rockli 发表于 2012-7-31 11:05
1
132
400
资深技术员
0
138
418
23
818
2595
79
256
中级技术员
ff.JPG (41.26 KB )
下载附件
2012-7-31 17:33 上传
nTest = nTest1; if(nTest != nTest1) { break; }
117563 不加volatile nTest = nTest1; if(nTest != nTest1) { break; } 被优化了 是不是这个原因啊 ==================================== yiucing 发表于 2012-7-31 17:33
看看我的解释对你有没有帮助: 1.首先楼主认识上有个问题,编译器不仅仅对main里全局变量感兴趣,而是对整个文件/工程的全局变量都感兴趣,所以人们为了避免编译器对某些特殊地址或特殊用途的变量感兴趣,就搞了一些 ... sinonion 发表于 2012-7-31 16:10
多谢你的详细解答。不过因为大侠在keilC51下 举不出不用volatile会出现问题的例子,所以属于有理论没实践。 ============================= 我现在的认识是这样的: 第二条一个中断服务子程序中会访问到的非自动 ... misra 发表于 2012-8-1 10:01
帅哥 你这是说的第几条? 中断在哪里? misra 发表于 2012-8-1 11:28
15# ayb_ice 这个例子试了一下,加不加看汇编代码完全一样啊,求解释。。 我#12楼的例子难道不能解释这个问题么,因为被优化了,所以永远执行不到吧。。 ... yiucing 发表于 2012-8-1 11:55
发表回复 本版积分规则 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
2
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号