ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM8] 我要怎样理解你,我的COSMIC

[复制链接]
150|9
 楼主 | 2019-9-16 18:40 | 显示全部楼层 |阅读模式
最近疑似被人诅咒,编程时经常遇到一些莫名其妙的问题。就是这个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

使用特权

评论回复
| 2019-9-16 18:49 | 显示全部楼层
这是你对c语言的理解有问题,常数默认int型,8位单片机int型多为16位,也就是-32768~32767的范围,你40*1000已经溢出了。

使用特权

评论回复
| 2019-9-16 19:58 | 显示全部楼层
暴躁老哥

使用特权

评论回复
| 2019-10-14 15:18 | 显示全部楼层
这个是不是超过范围了

使用特权

评论回复
| 2019-10-14 15:22 | 显示全部楼层
数据位数的问题

使用特权

评论回复
| 2019-10-14 15:26 | 显示全部楼层
就是没有理解到位

使用特权

评论回复
| 2019-10-14 15:30 | 显示全部楼层
我也有点想法了

使用特权

评论回复
| 2019-10-14 15:32 | 显示全部楼层
这种问题 单步调试的时候应该就能看出来

使用特权

评论回复
| 2019-10-14 15:39 | 显示全部楼层
我也有过这种错误

使用特权

评论回复
| 2019-10-15 11:28 | 显示全部楼层
学艺不精

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表