标题: 新手求大神帮看看为什么单片机程序会卡死? [打印本页]

作者: xmfjfhcel    时间: 2020-3-29 22:56
标题: 新手求大神帮看看为什么单片机程序会卡死?
本帖最后由 xmfjfhcel 于 2020-3-30 09:30 编辑


咨询高手大侠,下面这样作判断为什么程序会卡死呢?我是想判断一个状态如果连续出现错误50次,就认为设备有问题,如果这50次中哪怕有一次正确的值返回来也认为设备是好的,又从头开始计数判断。
感谢楼下的解答,我把程序改一下,昨晚没处理好,这样就清楚了,但是程序我观察了下,如果返回值为1了, errorchecknum增加了,程序就卡死了。errorchecknum是全局变量。
#include<reg52.h>
unsigned int errorchecknum=0;

unsigned char check()
{...............
               if(checkdata==data)
                 {
                      errorchecknum=0;
                       return 0;
                  }
               else
                 {
                     errorchecknum++;
                     return 1;
                 }
}



void main()
{.................
while(1)
          {         
                check();
                if(errorchecknum==50)
                {
                       //设备有问题
                 }
            }
}



作者: f556    时间: 2020-3-30 01:14
unsigned char Dartcheck()
{
void check()
这种明显不对,删除unsigned char Dartcheck()
第3句改为 unsigned char check()就与return 1和while(1)中的调用对应了
作者: csmyldl    时间: 2020-3-30 01:27
errorchecknum是否是全程变量,另外判断errorchecknum==50,如果设备真有问题,这只是瞬间存在,所以这一句改为errorchecknum>50
作者: 文心雕龙7    时间: 2020-3-30 02:36
首先你要确定errorchecknum是否定义为全局volatile易挥发变量,因为在循环判断errorchecknum值时,errorchecknum可能会取缓存值,不会更新,所以需要定义volatile unsigned uint8 errorchecknum。
其次将errorchecknum==50改为errorchecknum >50。
作者: 黄youhui    时间: 2020-3-30 08:29
void check();是什么?第三行,被unsigned char Dartcheck()函数内构造函数?
作者: heilongbao    时间: 2020-3-30 08:55
是不是没有定义变量!然后冲突了
作者: wulin    时间: 2020-3-30 09:15
unsigned char errorchecknum;
bit Error;

void check()
{
        if(故障信息为真)
        {
                errorchecknum++;
                if(errorchecknum>=50)
                {
                        errorchecknum=50;
                        Error=1;
                }
        }
        else errorchecknum==0;
}

void main()
{
        while(1)
        {         
                check();
                if(Error)//设备有问题
                {                       
                        //处理故障
                        if(故障排除)
                        {
                                Error=0;
                                errorchecknum=0;
                        }
                }
        }
}
作者: xmfjfhcel    时间: 2020-3-30 09:52
文心雕龙7 发表于 2020-3-30 02:36
首先你要确定errorchecknum是否定义为全局volatile易挥发变量,因为在循环判断errorchecknum值时,errorche ...

嗯,好的,谢谢提醒,我试试定义为volatile看看
作者: xmfjfhcel    时间: 2020-3-30 10:00
因为程序在一开始就卡死了, 怀疑在errrochecknum=1的时候程序就锁死了…………如果程序取消对errrochecknum的判断,就正常运行没有问题。

这个问题想了几天都没有想明白。
作者: xmfjfhcel    时间: 2020-3-30 10:32
wulin 发表于 2020-3-30 09:15
unsigned char errorchecknum;
bit Error;

感谢, 回头按你这个思路改一下看看。
因为现在设备是好的,errorchecknum肯定是到不了50,之前关键是一到errorchecknum=1就死掉了。 当有错误数据传第一次传过来,程序就卡死…………感觉就是errorchecknum在赋值为1后,下次来一个正确的数据,errochecknum又该赋值为0,这时时候就卡住了。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1