最近疑似被人诅咒,编程时经常遇到一些莫名其妙的问题。就是这个STVD+COSMIC,一直都感觉挺好用似乎从来没有出过问题。可偏偏就是这个从来没让你失望的朋友背后捅你一刀让你猝不及防。
事情是这样的:有一个串联阻值计算的公式,由于阻值精度和范围都很大。所以数值也放的很大具体如下
u32 buf32 = buf16>=1023?1022:buf16;
buf32 = buf32*(10.5*40)/(1023-buf32);//Unit:25KR, Get The Target Resistance
buf16 = buf32<65535*2?buf32+1>>1:65535;//Unit=50KR, Avoid Overflows And Round-up The Decimals
buf16 = buf16>20?buf16-20:0;// sub 1MR
这样的计算结果都能正常,但是如果你把代码第三行的数值稍微改一改计算结果甚至都更小,情况就会变得莫名其妙了:
u32 buf32 = buf16>=1023?1022:buf16;
buf32 = buf32*(10.5*40)/(1023-buf32);//Unit:25KR, Get The Target Resistance
buf16 = buf32<1000*40?buf32+1>>1:1000*20;//Unit=50KR, Avoid Overflows And Round-up The Decimals
buf16 = buf16>20?buf16-20:0;// sub 1MR
改完之后仿真跟踪发现:同样的第二行代码,计算的结果就是不对,执行完后buf32的值仍然是第一行的赋值。由于当时还有其它地方也一起做了修改,并且第三行的数值改动也不大,如果之前担心会溢出改过之后就更加不会溢出了因为数值更小了,也仿真查过原因发现第二行的计算结果就不对(现在都没弄明白为什么第三行的代码会反过来影响第二行的计算结果)。所以打死都想不到是第三行的数值造成的问题。为了查找原因前前后后折腾了整整一个下午,甚至试过重装COSMIC也都无济于事。就差打电话去ST挨个猛屌一顿了。
当我几度崩溃决定放弃之后,尝试把第三行的数值改用直接写结果40000问题居然消失了。我这才恍然大悟,但是出现这种问题完全是编译器有问题,只能说明COSMIC坑很多。
加上UL之后也可以解决以上问题,改正之后:
u32 buf32 = buf16>=1023?1022:buf16;
buf32 = buf32*(10.5*40)/(1023-buf32);//Unit:25KR, Get The Target Resistance
buf16 = buf32<1000UL*40UL?buf32+1>>1:1000UL*20UL;//Unit=50KR, Avoid Overflows And Round-up The Decimals
buf16 = buf16>20?buf16-20:0;// sub 1MR |