打印

数据溢出对单片机的影响

[复制链接]
5484|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
它山之石|  楼主 | 2014-11-18 23:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xuyaqi| | 2014-11-19 07:02 | 只看该作者
复位不会只是运行不正常

使用特权

评论回复
板凳
ayb_ice| | 2014-11-19 07:56 | 只看该作者
与复位没有必然关系

使用特权

评论回复
地板
wangch_sh| | 2014-11-19 08:09 | 只看该作者
无符号字符型数据,不可能大于255

使用特权

评论回复
5
ningling_21| | 2014-11-19 09:02 | 只看该作者
复位不太可能,有可能会进入死循环

使用特权

评论回复
6
xlsbz| | 2014-11-19 14:02 | 只看该作者
大于255 就按照减去255运行。至于会怎么样 我相信,你懂的

使用特权

评论回复
7
原野之狼| | 2014-11-19 14:11 | 只看该作者
会出现逻辑问题  不会出现机器问题

使用特权

评论回复
8
mcu5i51| | 2014-11-19 15:53 | 只看该作者
是呀,只和你的程序有关,运算的结果只是取余了

使用特权

评论回复
9
dongranmengming| | 2014-11-19 17:28 | 只看该作者
理论上是溢出,然后丢弃高位,只会出现错误数据和逻辑

使用特权

评论回复
10
它山之石|  楼主 | 2014-11-19 17:58 | 只看该作者
ningling_21 发表于 2014-11-19 09:02
复位不太可能,有可能会进入死循环

我的程序貌似就是死循环了

使用特权

评论回复
11
它山之石|  楼主 | 2014-11-19 18:10 | 只看该作者
本帖最后由 它山之石 于 2014-11-19 18:11 编辑
ningling_21 发表于 2014-11-19 09:02
复位不太可能,有可能会进入死循环


我的程序是用在执行器上的,跑两天就死机,给信号也不动作了。

死机的时候,我测试过晶振波形,是正常的。并且我把reset和GND短接一下,整个执行器就又动作了。断电再重新上电也可以恢复正常。

现在在纠结原因?

我没有打开软件看门狗。

程序中我定义了一个unsigned char的全局变量,这个变量可能溢出。但是溢出后如果像上面说的把溢出的数据截断成uchar类型,也不会跑死机吧?

使用特权

评论回复
12
xiphixiongfei| | 2014-11-19 18:14 | 只看该作者
判断条件永远不会满足,死不死机就看你调用的地方啦

使用特权

评论回复
13
它山之石|  楼主 | 2014-11-19 18:21 | 只看该作者
本帖最后由 它山之石 于 2014-11-19 18:23 编辑
xiphixiongfei 发表于 2014-11-19 18:14
判断条件永远不会满足,死不死机就看你调用的地方啦


这是AD中断里面的语句。m是我定义的unsigned char类型的全局变量。并且Input_normal1和Input_normal之差可能大于255.

case 1:
                temp[temp_AD_1] = AD_Count;

        
                        temp_AD_1++;
                        //WDTC=0X05;
                        if(temp_AD_1>=10)
                        {
                                data_AD[1]=datachlit(temp,10);//采样十次求平均值
                                temp_AD_1 = 0;
                                ADC1 = 0x42;
                            Input_normal1 = data_AD[1];//新采样值
                                
                                //input_to_feeddback();
                                if(Input_normal1>Input_normal)//如果新采样值大于旧采样值
                                {
                                        m=Input_normal1-Input_normal;               
                                }        
                                else//如果新采样值小于旧采样值

                                {
                                        m=Input_normal-Input_normal1;
                                }
                                if(m>=10)//如果新旧差值大于10
                                {
                                        Input_normal=Input_normal1;//取新值        
                                }
                                else//如果新旧差值小于10

                                {
                                        Input_normal=Input_normal;//取旧值
                                }
                                if(Input_normal>(input_max-10))
                                        Input_normal = input_max;
                                if(Input_normal<10)
                                        Input_normal = 0;

使用特权

评论回复
14
它山之石|  楼主 | 2014-11-19 18:23 | 只看该作者
原野之狼 发表于 2014-11-19 14:11
会出现逻辑问题  不会出现机器问题

xiphixiongfei 发表于 2014-11-19 18:14
判断条件永远不会满足,死不死机就看你调用的地方啦


这是AD中断里面的语句。m是我定义的unsigned char类型的全局变量。并且Input_normal1和Input_normal之差可能大于255.

case 1:
                temp[temp_AD_1] = AD_Count;

        
                        temp_AD_1++;
                        //WDTC=0X05;
                        if(temp_AD_1>=10)
                        {
                                data_AD[1]=datachlit(temp,10);//采样十次求平均值
                                temp_AD_1 = 0;
                                ADC1 = 0x42;
                            Input_normal1 = data_AD[1];//新采样值
                                
                                //input_to_feeddback();
                                if(Input_normal1>Input_normal)//如果新采样值大于旧采样值
                                {
                                        m=Input_normal1-Input_normal;               
                                }        
                                else//如果新采样值小于旧采样值

                                {
                                        m=Input_normal-Input_normal1;
                                }
                                if(m>=10)//如果新旧差值大于10
                                {
                                        Input_normal=Input_normal1;//取新值        
                                }
                                else//如果新旧差值小于10

                                {
                                        Input_normal=Input_normal;//取旧值
                                }
                                if(Input_normal>(input_max-10))
                                        Input_normal = input_max;
                                if(Input_normal<10)
                                        Input_normal = 0;

使用特权

评论回复
15
它山之石|  楼主 | 2014-11-19 18:24 | 只看该作者
ningling_21 发表于 2014-11-19 09:02
复位不太可能,有可能会进入死循环

xiphixiongfei 发表于 2014-11-19 18:14
判断条件永远不会满足,死不死机就看你调用的地方啦


这是AD中断里面的语句。m是我定义的unsigned char类型的全局变量。并且Input_normal1和Input_normal之差可能大于255.

case 1:
                temp[temp_AD_1] = AD_Count;

        
                        temp_AD_1++;
                        //WDTC=0X05;
                        if(temp_AD_1>=10)
                        {
                                data_AD[1]=datachlit(temp,10);//采样十次求平均值
                                temp_AD_1 = 0;
                                ADC1 = 0x42;
                            Input_normal1 = data_AD[1];//新采样值
                                
                                //input_to_feeddback();
                                if(Input_normal1>Input_normal)//如果新采样值大于旧采样值
                                {
                                        m=Input_normal1-Input_normal;               
                                }        
                                else//如果新采样值小于旧采样值

                                {
                                        m=Input_normal-Input_normal1;
                                }
                                if(m>=10)//如果新旧差值大于10
                                {
                                        Input_normal=Input_normal1;//取新值        
                                }
                                else//如果新旧差值小于10

                                {
                                        Input_normal=Input_normal;//取旧值
                                }
                                if(Input_normal>(input_max-10))
                                        Input_normal = input_max;
                                if(Input_normal<10)
                                        Input_normal = 0;

使用特权

评论回复
16
qqljhang| | 2014-11-19 21:40 | 只看该作者
指针溢出可能会导致跑飞,     你说的这是数据格式溢出不会,只是高位会被自动丢弃.

使用特权

评论回复
17
coody| | 2014-11-19 22:56 | 只看该作者
unsigned char m,m不可能大于255,还是好好检查程序吧。

使用特权

评论回复
18
它山之石|  楼主 | 2014-11-20 08:00 | 只看该作者
coody 发表于 2014-11-19 22:56
unsigned char m,m不可能大于255,还是好好检查程序吧。

您是说检查别的地方么?

很奇怪,刚开始还好好的。但是运行十多个小时,就会死在某个地方了。而且复位或者重新上电就好了。

使用特权

评论回复
19
ningling_21| | 2014-11-20 09:02 | 只看该作者
它山之石 发表于 2014-11-20 08:00
您是说检查别的地方么?

很奇怪,刚开始还好好的。但是运行十多个小时,就会死在某个地方了。而且复位或 ...

可以进入调试状态运行十几个小时,看看死在什么地方

使用特权

评论回复
20
大道至简| | 2014-11-20 13:18 | 只看该作者
抚慰是不会的,unsigned char a=300,实际得到的数字是300-256
这个是悄悄进行的,编译器不会告诉你的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:<img src="static/image/smiley/comcom/3.gif" class="vm">

95

主题

547

帖子

4

粉丝