搜索
bottom↓
回复: 27

很简单的一段程序偶尔会工作异常呢?

[复制链接]

出0入0汤圆

发表于 2020-4-16 18:44:59 | 显示全部楼层 |阅读模式
请教一下,为什么这段程序,有的时候异常的?变量无法清零。
        if(Flag_Rec)
        {
         if(Flag_Rec<10)Flag_Rec++; else  Flag_Rec=0;
        }

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入89汤圆

发表于 2020-4-16 18:49:28 | 显示全部楼层
一般都是优化出的问题,加volatile试试

出0入8汤圆

发表于 2020-4-16 18:58:52 来自手机 | 显示全部楼层
补充2楼  栈溢出,野指针

出0入0汤圆

发表于 2020-4-16 19:16:15 来自手机 | 显示全部楼层
因为Flag_Rec为0后就再也无法执行到条件内部的语句了。

出0入0汤圆

 楼主| 发表于 2020-4-16 19:36:02 | 显示全部楼层
adongliu 发表于 2020-4-16 19:16
因为Flag_Rec为0后就再也无法执行到条件内部的语句了。

目的就是把Flag_Rec清零,有的程序这一段程序Flag_Rec清不了零。

出0入76汤圆

发表于 2020-4-16 21:26:05 | 显示全部楼层
查找一下是不是在别的地方还有写操作? 多数情况是程序设计错误造成的

出0入0汤圆

发表于 2020-4-17 00:28:59 来自手机 | 显示全部楼层
遇到过类似问题,变量溢出已经是个非常大的负值

出0入55汤圆

发表于 2020-4-17 02:16:13 来自手机 | 显示全部楼层
把第一句改成if(flag_rec>0)

出255入0汤圆

发表于 2020-4-17 06:42:10 来自手机 | 显示全部楼层
程序逻辑有问题

出0入0汤圆

发表于 2020-4-17 07:05:46 来自手机 | 显示全部楼层
jssd 发表于 2020-4-17 02:16
把第一句改成if(flag_rec>0)

如果定义的无符号就没这个问题

出0入0汤圆

发表于 2020-4-17 07:41:11 来自手机 | 显示全部楼层
初始化没有?

出100入0汤圆

发表于 2020-4-17 08:11:26 | 显示全部楼层
至少把定义写出来吧。

出0入0汤圆

发表于 2020-4-17 09:10:35 | 显示全部楼层
时有时无的问题多半是代码逻辑问题不是优化问题

出10入0汤圆

发表于 2020-4-17 09:24:23 | 显示全部楼层
碰到过一次变量值奇怪变化的,后来发现是选错了MCU型号

出0入0汤圆

发表于 2020-4-17 10:35:00 | 显示全部楼层
看程序的逻辑,应该是有另外一个地方把Flag_Rec赋值成大于0的一个数。如果这个地方是另外的线程或者中断,Flag_Rec需要加上volatile。

出0入0汤圆

 楼主| 发表于 2020-4-17 10:44:15 | 显示全部楼层
foxpro2005 发表于 2020-4-16 21:26
查找一下是不是在别的地方还有写操作? 多数情况是程序设计错误造成的

串口中断有置1的操作

出0入0汤圆

 楼主| 发表于 2020-4-17 10:44:43 | 显示全部楼层
nanfang2000 发表于 2020-4-17 00:28
遇到过类似问题,变量溢出已经是个非常大的负值

请教一下什么情况导致的溢出呢

出0入0汤圆

 楼主| 发表于 2020-4-17 10:45:05 | 显示全部楼层
wochai 发表于 2020-4-17 08:11
至少把定义写出来吧。

定义的是unsigned char

出0入0汤圆

 楼主| 发表于 2020-4-17 10:45:32 | 显示全部楼层
flamma 发表于 2020-4-17 10:35
看程序的逻辑,应该是有另外一个地方把Flag_Rec赋值成大于0的一个数。如果这个地方是另外的线程或者中断,F ...

串口中断有置1的操作

出0入4汤圆

发表于 2020-4-17 10:48:32 | 显示全部楼层
如果Flag_Rec为零,在哪里改变他的状态?

出0入55汤圆

发表于 2020-4-17 10:55:33 | 显示全部楼层
Doci 发表于 2020-4-17 10:45
串口中断有置1的操作

上面都说了,在中断和外面都有操作,加上volatile

出0入0汤圆

发表于 2020-4-17 11:05:51 | 显示全部楼层
f(Flag_Rec<10)Flag_Rec++; else  Flag_Rec=0;这行上面关中断、下面开中断

出0入75汤圆

发表于 2020-4-17 11:21:05 | 显示全部楼层
在中断里加判断,if(!Flag_Rec) Flag_Rec = 1;

出0入0汤圆

发表于 2020-4-17 12:48:26 | 显示全部楼层
这里就涉及到原子操作问题了。。。楼主,经验还是不够,一般来说,中断和中断外面,只有一个写入动作,如果有两个,最好加上锁。。。

出0入0汤圆

发表于 2020-4-18 02:15:20 | 显示全部楼层
Doding 发表于 2020-4-17 11:21
在中断里加判断,if(!Flag_Rec) Flag_Rec = 1;

+1;那个楼上说关中断,开中断,会导致不确定结果;

出0入0汤圆

发表于 2020-4-18 08:54:02 | 显示全部楼层
一直有中断就会一直赋值1,当然无法清零

出0入0汤圆

 楼主| 发表于 2020-4-18 11:02:26 | 显示全部楼层
whw639 发表于 2020-4-18 08:54
一直有中断就会一直赋值1,当然无法清零

这个肯定不可能的啊,只有一次赋值,后面上位机就不发送了

出0入4汤圆

发表于 2020-4-18 11:37:52 | 显示全部楼层
硬件有干扰产生,造成中断影响?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 13:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表