哈,@一下 ,@周翼翼对我的评价,我是个不相信编译器的人。这次又倒霉了。 不过目前还不能确定是编译器的错。一个代码,逻辑没问题,上板子跑就出错。该语句放到一个函数内执行,就正确。 典型编译优化过度,或CPU流水线太深数据跟不上的错。 吃过N多次亏了。 继续保持怀疑编译器的心态,写代码。
aa >>=X; d = (short*)&aa; p->a |=( !p->b&&(( (c== 0)&& (iabs(d[0])>>1 == 0) && (iabs(d[1])>>1 == 0)))) << e; //出错。 //该成 void sub_func(P*p,int c,short d,int e){ p->a |=( !p->b&&(( (c== 0)&& (iabs(d[0])>>1 == 0) && (iabs(d[1])>>1 == 0)))) << e; } //再调用这个子函数, aa >>=X; d = (short)&aa; sub_func(p,c,d,e); //p->a的值就正确。实际上硬件跟踪,d[1]的数据未到位。 //我修改了变量名,请大家不要怀疑代码的逻辑问题。呵呵。
准确说也不能算是编译器出问题。毕竟是比较标准的ARM编译器。更怀疑是芯片设计工艺的问题,导致寄存器数据跟不上。这类情况吃过不少苦。优化过头了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
希望楼主能多分享下优化心得哈
######心得?就是怀疑一切。我相信在Soc公司里,开发driver,特别是网络,电源管理,总线方面的朋友都知道。spec有时只能当草纸用。
######反汇编下代码,看看编译结果有无问题.######去掉编译优化选项再试试######会不会跟子函数传递形参有关?###### 你用的是什么编译器? gcc for arm?你这个问题很可能是编译器的问题.
gcc不可靠的对容易有歧义和很复杂的表达式,编译出来的东西是错误的.以前遇到过.
VC的或者商用编译器就好多了. ######这么说,反汇编已经检查过了吧,如果确定汇编也没有问题的话,那就只能是硬件层的了。 编译器一般情况下是不会犯错的,因为它无论怎么优化,第一个原则就是正确性,在原程序中会被执行的代码在结果里也一定会被执行。然而,对于不同的芯片,实现上可能会有一定的差异,对编译器也有不同程度的裁剪,但它毕竟只是个程序。再者,芯片实现越来越复杂,内部指令到底是个怎么执行流程,连代码自己都不能知道,何况是编译器和程序员。######