打印
[STM32F1]

请教代码运行错乱问题,请香水城版主帮忙解答下

[复制链接]
781|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdszzyq|  楼主 | 2019-11-8 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gdszzyq 于 2019-11-20 11:12 编辑

有一段代码在以前的设备中都运行正常,今天在一台设备也是类似的写法却出现问题,程序没有跑死,也没有复位,但第三代码无法被执行,third没被赋值为1,也就是说 if(count==50)first=1;没执行,导致 third=1;也没执行,难道count这个变量从49直接跳过50到51了?count的值为101,second这个变量一直在累加,说明程序正常运行,百思不得其解。初步怀疑是供电不稳定导致的,我也尝试瞬断供电也模拟出这种情况,要说电压过低MCU也会复位啊,但它又没有复位,我的程序开启了低电压检测,但在中断里只是保存一些不相关的数据而已,为何count累加时会跳过50这个值呢?而同样的写法在别的设备上都没问题,用的都是一样的板子。请大家帮忙分析一下是什么原因,谢谢了。

u8 count,first,second,third;
int main(void)
{
   count=0;
   first=0;
   second=0;
   third=0;
   while(1)
   {
       if(count==50)first=1;
       if(count>100)
       {
            second+=1;
       }
       else count++;
      //第三段代码
       if(first==1)
       {
           third=1;
       }
       ......
   }
}

使用特权

评论回复
沙发
gdszzyq|  楼主 | 2019-11-9 11:08 | 只看该作者
请高手帮忙分析一下原因,谢谢

使用特权

评论回复
板凳
ayb_ice| | 2019-11-9 15:27 | 只看该作者
gdszzyq 发表于 2019-11-9 11:08
请高手帮忙分析一下原因,谢谢

count在其它地方有改变吧

使用特权

评论回复
地板
gdszzyq|  楼主 | 2019-11-10 09:22 | 只看该作者
count只在一个地方累加

使用特权

评论回复
5
gdszzyq|  楼主 | 2019-11-12 15:59 | 只看该作者
请高手帮忙分析下,谢谢

使用特权

评论回复
6
gdszzyq|  楼主 | 2019-11-13 13:51 | 只看该作者
没人帮忙解答下吗

使用特权

评论回复
7
gdszzyq|  楼主 | 2019-11-20 10:58 | 只看该作者
有人帮忙解答下吗

使用特权

评论回复
8
kingkits| | 2019-11-20 11:07 | 只看该作者
你可以考虑把count的定义放在main函数里试试,说不定有效果

随便弄段代码就让人家解释?
这个问题应该是整个系统问题,需要看完整的工程

使用特权

评论回复
9
gdszzyq|  楼主 | 2019-11-20 11:19 | 只看该作者
整个工程放上来,谁有那时间看啊,我把示例放上来就是让大家看得明白又不费时间,count这个变量就是在一个文件里定义的全局变量,而且其它文件没有用到这个变量,这个变量也没有在任何中断里调用过

使用特权

评论回复
10
sonicll| | 2019-11-20 11:32 | 只看该作者
增加一些调试信息看看吧,比如在count++那里把count值打印出来,观察一下count值的变化过程

使用特权

评论回复
11
gdszzyq|  楼主 | 2019-11-20 13:39 | 只看该作者
关键不是经常会这样,只是在某一块机器偶尔会出现这种情况,怀疑是供电不稳导致,但不明白为什么程序又没有复位只是异常

使用特权

评论回复
12
香水城| | 2019-11-20 13:58 | 只看该作者
本帖最后由 香水城 于 2019-11-20 17:00 编辑

但愿你这里描述的跟你的真实问题是一致的。

确认该变量有无可能被其它地方改动。

可以尝试将代码一段一段屏蔽,看看到底哪里除了问题。

另外,请你也注意下优化方面的问题。

使用特权

评论回复
13
gdszzyq|  楼主 | 2019-11-20 14:37 | 只看该作者
一、请大家相信我,这些基本的检查我肯定有做的,count这个变量只用几行代码里,一个初始为0,一个累加,二个判断,我屏蔽掉定义这个变量编译一下就看可看出哪里出错。
二、这种写法我已经用几年了都没问题,就前段时间做的一台设备出现这种情况,关键是不是一直出现这种情况,只是偶尔出现,我通过将供电插头慢慢拔出(没有真正拔出)就可以模拟出这种情况,所以怀疑和供电不稳有关,后来只能将代码改成解决了问题:新增一个变量val,但这样做效率不高而且还增加了变量。
if(val==1)
{
       if(count>50)first=1;
       val=0;
}
       if(count>100)
       {
            second+=1;
       }
       else count++;
}
搞得我现在都不敢用这种写法了,照理是不应该出现这种情况,要么程序出现复位,要么正常运行,但现在偏偏是程序又没有复位,但又没有正常运行(到底是count++这句跳过50这个值还是当count=50时没有执行if(count==50)first=1;)

使用特权

评论回复
14
gdszzyq|  楼主 | 2019-11-20 14:53 | 只看该作者
本帖最后由 gdszzyq 于 2019-11-20 15:10 编辑

我把代码写清楚一点吧,出问题的代码如下,u8 a,b,c,d,e;   //全局变量,这几个变量只在如下代码中出现,没有任何其它地方出现
if(a==1)
{
    b=1;
    c=0;
    a=0;
}
if(b==1)
{
    if(c==10)d=1;   //d偶尔无法赋值为1
    if(c>100)
    {
         e=1;
         b=0;
    }
    else c++;
}

当程序检测到a等于1时给b和c赋初值,然后执行下面一段代码,当c=10时给d赋值为1(就是d偶尔没有赋值为1),e可以正常赋值为1
而且这种写法我都用几年了都没出问题,只是这台设备出现这问题

使用特权

评论回复
15
gdszzyq|  楼主 | 2019-11-20 14:57 | 只看该作者
本帖最后由 gdszzyq 于 2019-11-20 15:09 编辑
gdszzyq 发表于 2019-11-20 14:53
我把代码写清楚一点吧,出问题的代码如下,u8 a,b,c,d,e;   //全局变量,这几个变量只在如下代码中出现,没 ...

只有改成以下这样才能正常运行u8 a,b,c,d,e,val;   //全局变量,这几个变量只在如下代码中出现,没有任何其它地方出现
if(a==1)
{
    b=1;
    c=0;
    val=1;
    a=0;
}
if(b==1)
{
    if(val==1)    //改成这样写就没问题
    {
         if(c>9)d=1;
         val=0;
    }
    if(c>100)
    {
         e=1;
         b=0;
    }
    else c++;
}

这样就可以正常运行,但增加了变量,效率也不高。

使用特权

评论回复
16
xiaoqizi| | 2019-12-4 14:06 | 只看该作者
这个是常量了啊

使用特权

评论回复
17
木木guainv| | 2019-12-4 14:11 | 只看该作者
条件判定有问题吧

使用特权

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

本版积分规则

46

主题

322

帖子

3

粉丝