[C语言]

在C里,怎么能够知道一个变量停止增加了?

[复制链接]
1751|20
手机看帖
扫描二维码
随时随地手机跟帖
一叶倾城wwq|  楼主 | 2018-6-12 13:48 | 显示全部楼层 |阅读模式
本帖最后由 一叶倾城wwq 于 2018-6-13 10:09 编辑

比如定义一个整型全局变量a,然后在其他地方有事件导致增加a++(我是在MCU的中断里面),怎样才能知道这个变量不再连续增加了?就比如增加到某一个数值时,不再连续增加,而是有停顿(时间可能长可短),就是得知道它在某一时刻停止增加了,也许到程序跑完也不会再出现增加的情况。不知道我说清楚了没?欢迎各位前辈来指点迷津和讨论可以这样理解下图:这是一个信号,当它不稳定时出现波动导致a++,稳定是a是固定的,确定不会有任何地方在引起自增,所以我想知道何时是稳定的,也就是a不再自增了(停顿)。能不能弄个a的当前值和上次值来进行比较,就知道了,但这个操作思路没想好,所以来求助各位前辈

以下是经过思考后的解决方法,但只验证并使用了第二种方法(感谢各位前辈的热心帮助):
1.在a++的同时,置一个自增标志(bool)为true,注意初始化为false,避免一上电运行就增加不必要的判断;而后就是各位前辈都提过的定时,定时500ms(比如)把自增标志置为false,而后在主程序里判断if(!自增标志),注意这儿可能有两种情况,一是确实为假,a并未在中断里增加,二是为真,在自增;在主程序检测为假时,说明确实稳定了,这段时间不再增加(可以执行事件)。
2.直接使用定时器一段时间将a清空,把控好这个定时时间,需多次检测调试,因为信号并不是经常出现波动。
3.就是我一开始所想的当前值和上次值,但若有好几个地方对a++就不太适用,在每一次进入检测时将last=a;而后在a++后new=a;这样在程序中来判断什么时候last=new;那么说明没有再自增(h或许应有个比较间隔)。
注:不对的地方还请前辈们赐教

如何检测增加停顿了.jpg

相关帖子

ayb_ice| | 2018-6-12 14:15 | 显示全部楼层
打印出来,或者如果变化了就亮个灯什么的

使用特权

评论回复
xmar| | 2018-6-12 14:24 | 显示全部楼层
这就要看整个程序(包括中断程序)中有多少处a++或隐含的a++。何时程序再不会运行那些a++,就能够知道这个变量a停止增加了。

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-12 14:25 | 显示全部楼层
ayb_ice 发表于 2018-6-12 14:15
打印出来,或者如果变化了就亮个灯什么的

打印出来是人可以知道,但无法让它自己知道这个变量没有再增加,还需要让它知道停止增加然后执行相应事件的,这个停顿的时间里需要做其他事,就是需要个停止增加的标志,但不知道这个标志该怎么去判断

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-12 14:33 | 显示全部楼层
xmar 发表于 2018-6-12 14:24
这就要看整个程序(包括中断程序)中有多少处a++或隐含的a++。何时程序再不会运行那些a++,就能够知道这个 ...

我就是在想能不能弄一个a的当前值和上次值,这样两个数一比较就知道它没有增加了,但如何来赋这两个值,我就没有思路了

使用特权

评论回复
xmar| | 2018-6-12 14:48 | 显示全部楼层
一叶倾城wwq 发表于 2018-6-12 14:33
我就是在想能不能弄一个a的当前值和上次值,这样两个数一比较就知道它没有增加了,但如何来赋这两个值, ...

这就要看你程序是如何定义a的当前值和上一次的值。严格、准确有效的的判断a的a的当前值和上一次的值是编程思路的关键。要搞清楚程序中a值变化循环,自然要清楚程序中有多少处a++或隐含的a++。又回到“板凳”。

使用特权

评论回复
wangyy608| | 2018-6-12 15:36 | 显示全部楼层
思考下,稳定的定义是什么,多长时间不增加是稳定

使用特权

评论回复
评论
幻想之翼 2018-6-12 20:40 回复TA
就是这样,需要有个时间的限指。 
linqing171| | 2018-6-12 21:11 | 显示全部楼层
软件看门狗:
1 开个硬件定时器
2 每次把这个变量++的地址,把定时器的计数值清空
3 如果长期不清空,定时器的技术值溢出, 产生中断.

使用特权

评论回复
Prry| | 2018-6-12 22:17 | 显示全部楼层
楼主把事情想复杂了吧,不就一句判断语句就解决的事情吗?

使用特权

评论回复
mailshichao| | 2018-6-13 08:06 | 显示全部楼层
我觉得应该在一定时间内a 的值增加多少表示不稳定,所有要有定时器确定时间,到时间了就判断;每次时间到了后判断a的值有没有大于一个标准值,判断处理完了后再将a=0;带下一次再判断。每次判断不管a的值是否有达到标准值都将a=0;

使用特权

评论回复
qq880115| | 2018-6-13 08:51 | 显示全部楼层
我觉得跟上一个值比较几次,还是可行的

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-13 09:47 | 显示全部楼层
xmar 发表于 2018-6-12 14:48
这就要看你程序是如何定义a的当前值和上一次的值。严格、准确有效的的判断a的a的当前值和上一次的值是编 ...

感谢提醒,在程序中共有几次对a进行增加的问题是一个很重要的关键,稍后我会在上方编辑里增加所想所用的解决方法

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-13 09:48 | 显示全部楼层
wangyy608 发表于 2018-6-12 15:36
思考下,稳定的定义是什么,多长时间不增加是稳定

嗯,前辈说的是,时间,也就是我所说的停顿的间隔,这个也是个关键,稍后我会在上方编辑里增加所想所用的解决方法,不对的地方还请前辈们赐教

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-13 09:49 | 显示全部楼层
linqing171 发表于 2018-6-12 21:11
软件看门狗:
1 开个硬件定时器
2 每次把这个变量++的地址,把定时器的计数值清空

前辈的说法和我的一个思路不谋而合,稍后我会在上方编辑里增加所想所用的解决方法,不对的地方还请前辈们赐教

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-13 09:50 | 显示全部楼层
Prry 发表于 2018-6-12 22:17
楼主把事情想复杂了吧,不就一句判断语句就解决的事情吗?

可是都是在中断里自增的,没法一个if解决,得增加东西,稍后我会在上方编辑里增加所想所用的解决方法,不对的地方还请前辈们赐教

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-13 09:52 | 显示全部楼层
mailshichao 发表于 2018-6-13 08:06
我觉得应该在一定时间内a 的值增加多少表示不稳定,所有要有定时器确定时间,到时间了就判断;每次时间到了 ...

定时的思路很好,也很简洁实用,昨天忙着弄东西了,稍后我会在上方编辑里增加所想所用的解决方法,不对的地方还请前辈们赐教

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-13 09:52 | 显示全部楼层
qq880115 发表于 2018-6-13 08:51
我觉得跟上一个值比较几次,还是可行的

就是,稍后我会在上方编辑里增加所想所用的解决方法,不对的地方还请前辈们赐教

使用特权

评论回复
丁弋宇| | 2018-6-15 12:41 | 显示全部楼层
变量拉脚上去,示波器,逻辑分析仪看看不就可以了

使用特权

评论回复
丁弋宇| | 2018-6-15 12:42 | 显示全部楼层
++频率慢的话就打点log,放个时间戳

使用特权

评论回复
一叶倾城wwq|  楼主 | 2018-6-17 23:19 | 显示全部楼层
丁弋宇 发表于 2018-6-15 12:42
++频率慢的话就打点log,放个时间戳

很好的测试方法,谢谢提示,问题已解决,就是为了检测信号是否连续变化,已在产品上调试过,接下来就看时间来验证了

使用特权

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

本版积分规则

78

主题

1259

帖子

11

粉丝