搜索
bottom↓
回复: 29

关于信号的延时

[复制链接]

出0入0汤圆

发表于 2012-11-27 15:44:23 | 显示全部楼层 |阅读模式
大家好,我想实现一个事件的透明延时,比如说如果事件A发生了,延时一段时间后产生一个触发信号。本来想用计数器实现,但如果延时时间比事件A的发生间隔还大的话就会造成后面事件A的丢失,不知大家有什么好的建议可以给小弟提供一下。谢谢了

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-11-27 15:54:22 | 显示全部楼层
或者将触发信号分开,或者保证延时不会大于A的周期

出0入0汤圆

 楼主| 发表于 2012-11-27 16:03:00 | 显示全部楼层
wildone 发表于 2012-11-27 15:54
或者将触发信号分开,或者保证延时不会大于A的周期

延时时间一般情况下都会大于A的发生周期(A不定期发生),触发信号如何分开呢

出0入0汤圆

发表于 2012-11-27 16:04:36 | 显示全部楼层
这要看你用触发信号来干嘛了

出0入0汤圆

 楼主| 发表于 2012-11-27 16:05:55 | 显示全部楼层
wildone 发表于 2012-11-27 16:04
这要看你用触发信号来干嘛了

触发一个状态机过程

出0入0汤圆

发表于 2012-11-27 16:11:42 | 显示全部楼层
多任务。不行就只能累积延时了。

出0入0汤圆

 楼主| 发表于 2012-11-27 16:13:06 | 显示全部楼层
netawater 发表于 2012-11-27 16:11
多任务。不行就只能累积延时了。

如何进行多任务,累积延时又怎么实现呢,可否详细说明下

出0入0汤圆

发表于 2012-11-27 16:14:12 | 显示全部楼层
你这个状态机需不需要在触发时就立刻运转

出0入0汤圆

 楼主| 发表于 2012-11-27 16:18:34 | 显示全部楼层
wildone 发表于 2012-11-27 16:14
你这个状态机需不需要在触发时就立刻运转

需要,一旦触发必须立即运行,运行完毕后再次等待触发。我目前想到的方案是每次A发生就将A发生的时间加上延时时间存入fifo,另一个状态机不断去读取这个fifo,如果发现fifo里的时间到了就触发,同时将这个时间剔除出fifo。但这种方案我总觉得不好

出0入0汤圆

发表于 2012-11-27 16:21:25 | 显示全部楼层
hujianhuacas 发表于 2012-11-27 16:13
如何进行多任务,累积延时又怎么实现呢,可否详细说明下

多任务就是一个任务响应事件A,一个任务延时执行触发了。两个任务都被调度器调度,就无所谓谁先谁后了。

出0入0汤圆

发表于 2012-11-27 16:24:59 | 显示全部楼层
hujianhuacas 发表于 2012-11-27 16:18
需要,一旦触发必须立即运行,运行完毕后再次等待触发。我目前想到的方案是每次A发生就将A发生的时间加上 ...

你的意思是这个状态机只能有一个,不能多任务

出0入0汤圆

 楼主| 发表于 2012-11-27 16:26:27 | 显示全部楼层
netawater 发表于 2012-11-27 16:21
多任务就是一个任务响应事件A,一个任务延时执行触发了。两个任务都被调度器调度,就无所谓谁先谁后了。 ...

现在关键是延时任务如何去实现才能不影响接收下一个任务,如果采用计数器,这次任务还没完成,下次的又要开始了。

出0入0汤圆

发表于 2012-11-27 16:28:30 | 显示全部楼层
hujianhuacas 发表于 2012-11-27 16:26
现在关键是延时任务如何去实现才能不影响接收下一个任务,如果采用计数器,这次任务还没完成,下次的又要 ...

既然是多任务,延时任务如何会影响执行任务了?计数器都是调度器使用的。

出0入0汤圆

 楼主| 发表于 2012-11-27 17:13:45 | 显示全部楼层
wildone 发表于 2012-11-27 16:24
你的意思是这个状态机只能有一个,不能多任务

确实只能有一个

出0入0汤圆

发表于 2012-11-27 18:25:16 | 显示全部楼层
你把事件A的发生记录下来,然后让后面的读就行了。类似于FIFO的结构就可以实现。

出0入0汤圆

发表于 2012-11-27 19:09:05 | 显示全部楼层
你如果没有多任务系统,那就用累积记时的方法。第一次事件发生时开始记时,到第二次事件发生时,减去已用的延迟时间重新来一次。

出0入0汤圆

 楼主| 发表于 2012-11-27 19:18:16 | 显示全部楼层
浮云残雪 发表于 2012-11-27 18:25
你把事件A的发生记录下来,然后让后面的读就行了。类似于FIFO的结构就可以实现。 ...

目前采用fifo对触发时间进行压栈,然后另一个模块读取fifo内的时间并在合适的时候触发是可以实现这个功能的,但动用fifo感觉对于这样一个问题结构是不是太复杂了,不知有没有更简洁的方法

出0入0汤圆

 楼主| 发表于 2012-11-27 19:20:41 | 显示全部楼层
netawater 发表于 2012-11-27 19:09
你如果没有多任务系统,那就用累积记时的方法。第一次事件发生时开始记时,到第二次事件发生时,减去已用的 ...

恕小弟愚钝,不知如果采用计数器不知如何实现多个事件的特定延时,可否说明的详细一些

出0入0汤圆

发表于 2012-11-27 20:03:14 | 显示全部楼层
hujianhuacas 发表于 2012-11-27 19:20
恕小弟愚钝,不知如果采用计数器不知如何实现多个事件的特定延时,可否说明的详细一些 ...


事件中断{
处理事件
if 延时计数器响应过 then
  设置本事件延时计数器
else
  重新设置前一事件延时计数器,减去它已经运行的时间。
  设置本事件延时计数器
}


计数器中断{
通知状态机
}

出0入0汤圆

发表于 2012-11-27 20:05:47 | 显示全部楼层
hujianhuacas 发表于 2012-11-27 19:18
目前采用fifo对触发时间进行压栈,然后另一个模块读取fifo内的时间并在合适的时候触发是可以实现这个功能 ...

是每一次A发生都要触发还是可以A发生但不触发。如果是后者,则可以采用类似视频处理中的抛帧处理。忽略掉在处理当前A触发时A事件的发生。也就是进入触发状态后,把A事件屏蔽了。

出0入0汤圆

 楼主| 发表于 2012-11-27 21:51:43 | 显示全部楼层
浮云残雪 发表于 2012-11-27 20:05
是每一次A发生都要触发还是可以A发生但不触发。如果是后者,则可以采用类似视频处理中的抛帧处理。忽略掉 ...

每次A都必须触发

出0入0汤圆

发表于 2012-11-27 22:39:13 | 显示全部楼层
hujianhuacas 发表于 2012-11-27 21:51
每次A都必须触发

要么用堆栈,要么用多片处理器同时处理

出0入0汤圆

发表于 2012-12-3 17:20:50 | 显示全部楼层
楼主搞定没?

出0入0汤圆

发表于 2012-12-3 21:18:07 | 显示全部楼层
看看这个帖子,可能对你有启发:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5475424

出0入0汤圆

 楼主| 发表于 2012-12-4 16:11:33 | 显示全部楼层
netawater 发表于 2012-12-3 17:20
楼主搞定没?

采用fifo方式可以实现,不知有没有更简单的

出0入0汤圆

 楼主| 发表于 2012-12-4 16:12:28 | 显示全部楼层
zhangalex88 发表于 2012-12-3 21:18
看看这个帖子,可能对你有启发:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5475424 ...

谢谢,不过这个帖子的输入是固定频率,我这个是随机的

出0入0汤圆

发表于 2012-12-4 17:05:14 | 显示全部楼层
本帖最后由 yp19890718 于 2012-12-4 17:07 编辑
hujianhuacas 发表于 2012-11-27 16:18
需要,一旦触发必须立即运行,运行完毕后再次等待触发。我目前想到的方案是每次A发生就将A发生的时间加上 ...


只能用这种方案.原理上和 指令缓存一样,你触发一次就表示有个指令,延迟时间大于A时间周期,你必须保存所有指令,
所以用FIFO是可行的.

出0入0汤圆

发表于 2012-12-6 21:11:37 | 显示全部楼层
hujianhuacas 发表于 2012-12-4 16:12
谢谢,不过这个帖子的输入是固定频率,我这个是随机的

用加减计数器,有事件发生就加1,计数器不为零就延时减1.每减一次就产生一个触发信号.
不知道你是不是要达到这样的效果?

出0入0汤圆

发表于 2012-12-6 21:39:11 | 显示全部楼层
如果对每次延时都有固定的时间要求,可以用以下的方法:
首先确定在延时期间最多有几个A事件回发生,设计时用n+1个计时器,
如果第1个计时器在工作,则触发第2个计时器,以此类推.确保每次只触发一个计时器.
每个计时器到计时完成都输出一个触发信号.

出0入0汤圆

 楼主| 发表于 2012-12-11 08:39:10 | 显示全部楼层
zhangalex88 发表于 2012-12-6 21:39
如果对每次延时都有固定的时间要求,可以用以下的方法:
首先确定在延时期间最多有几个A事件回发生,设计时用n ...

这样实现的话计数器可能需要很多了,相对而言采用fifo的方式应该更加灵活
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 07:17

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

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