hujianhuacas 发表于 2012-11-27 15:44:23

关于信号的延时

大家好,我想实现一个事件的透明延时,比如说如果事件A发生了,延时一段时间后产生一个触发信号。本来想用计数器实现,但如果延时时间比事件A的发生间隔还大的话就会造成后面事件A的丢失,不知大家有什么好的建议可以给小弟提供一下。谢谢了

wildone 发表于 2012-11-27 15:54:22

或者将触发信号分开,或者保证延时不会大于A的周期

hujianhuacas 发表于 2012-11-27 16:03:00

wildone 发表于 2012-11-27 15:54 static/image/common/back.gif
或者将触发信号分开,或者保证延时不会大于A的周期

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

wildone 发表于 2012-11-27 16:04:36

这要看你用触发信号来干嘛了

hujianhuacas 发表于 2012-11-27 16:05:55

wildone 发表于 2012-11-27 16:04 static/image/common/back.gif
这要看你用触发信号来干嘛了

触发一个状态机过程

netawater 发表于 2012-11-27 16:11:42

多任务。不行就只能累积延时了。

hujianhuacas 发表于 2012-11-27 16:13:06

netawater 发表于 2012-11-27 16:11 static/image/common/back.gif
多任务。不行就只能累积延时了。

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

wildone 发表于 2012-11-27 16:14:12

你这个状态机需不需要在触发时就立刻运转

hujianhuacas 发表于 2012-11-27 16:18:34

wildone 发表于 2012-11-27 16:14 static/image/common/back.gif
你这个状态机需不需要在触发时就立刻运转

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

netawater 发表于 2012-11-27 16:21:25

hujianhuacas 发表于 2012-11-27 16:13 static/image/common/back.gif
如何进行多任务,累积延时又怎么实现呢,可否详细说明下

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

wildone 发表于 2012-11-27 16:24:59

hujianhuacas 发表于 2012-11-27 16:18 static/image/common/back.gif
需要,一旦触发必须立即运行,运行完毕后再次等待触发。我目前想到的方案是每次A发生就将A发生的时间加上 ...

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

hujianhuacas 发表于 2012-11-27 16:26:27

netawater 发表于 2012-11-27 16:21 static/image/common/back.gif
多任务就是一个任务响应事件A,一个任务延时执行触发了。两个任务都被调度器调度,就无所谓谁先谁后了。 ...

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

netawater 发表于 2012-11-27 16:28:30

hujianhuacas 发表于 2012-11-27 16:26 static/image/common/back.gif
现在关键是延时任务如何去实现才能不影响接收下一个任务,如果采用计数器,这次任务还没完成,下次的又要 ...

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

hujianhuacas 发表于 2012-11-27 17:13:45

wildone 发表于 2012-11-27 16:24 static/image/common/back.gif
你的意思是这个状态机只能有一个,不能多任务

确实只能有一个

浮云残雪 发表于 2012-11-27 18:25:16

你把事件A的发生记录下来,然后让后面的读就行了。类似于FIFO的结构就可以实现。

netawater 发表于 2012-11-27 19:09:05

你如果没有多任务系统,那就用累积记时的方法。第一次事件发生时开始记时,到第二次事件发生时,减去已用的延迟时间重新来一次。

hujianhuacas 发表于 2012-11-27 19:18:16

浮云残雪 发表于 2012-11-27 18:25 static/image/common/back.gif
你把事件A的发生记录下来,然后让后面的读就行了。类似于FIFO的结构就可以实现。 ...

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

hujianhuacas 发表于 2012-11-27 19:20:41

netawater 发表于 2012-11-27 19:09 static/image/common/back.gif
你如果没有多任务系统,那就用累积记时的方法。第一次事件发生时开始记时,到第二次事件发生时,减去已用的 ...

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

netawater 发表于 2012-11-27 20:03:14

hujianhuacas 发表于 2012-11-27 19:20 static/image/common/back.gif
恕小弟愚钝,不知如果采用计数器不知如何实现多个事件的特定延时,可否说明的详细一些 ...

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


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

浮云残雪 发表于 2012-11-27 20:05:47

hujianhuacas 发表于 2012-11-27 19:18 static/image/common/back.gif
目前采用fifo对触发时间进行压栈,然后另一个模块读取fifo内的时间并在合适的时候触发是可以实现这个功能 ...

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

hujianhuacas 发表于 2012-11-27 21:51:43

浮云残雪 发表于 2012-11-27 20:05 static/image/common/back.gif
是每一次A发生都要触发还是可以A发生但不触发。如果是后者,则可以采用类似视频处理中的抛帧处理。忽略掉 ...

每次A都必须触发

浮云残雪 发表于 2012-11-27 22:39:13

hujianhuacas 发表于 2012-11-27 21:51 static/image/common/back.gif
每次A都必须触发

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

netawater 发表于 2012-12-3 17:20:50

楼主搞定没?

zhangalex88 发表于 2012-12-3 21:18:07

看看这个帖子,可能对你有启发:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5475424

hujianhuacas 发表于 2012-12-4 16:11:33

netawater 发表于 2012-12-3 17:20 static/image/common/back.gif
楼主搞定没?

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

hujianhuacas 发表于 2012-12-4 16:12:28

zhangalex88 发表于 2012-12-3 21:18 static/image/common/back.gif
看看这个帖子,可能对你有启发:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5475424 ...

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

yp19890718 发表于 2012-12-4 17:05:14

本帖最后由 yp19890718 于 2012-12-4 17:07 编辑

hujianhuacas 发表于 2012-11-27 16:18 static/image/common/back.gif
需要,一旦触发必须立即运行,运行完毕后再次等待触发。我目前想到的方案是每次A发生就将A发生的时间加上 ...

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

zhangalex88 发表于 2012-12-6 21:11:37

hujianhuacas 发表于 2012-12-4 16:12 static/image/common/back.gif
谢谢,不过这个帖子的输入是固定频率,我这个是随机的

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

zhangalex88 发表于 2012-12-6 21:39:11

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

hujianhuacas 发表于 2012-12-11 08:39:10

zhangalex88 发表于 2012-12-6 21:39 static/image/common/back.gif
如果对每次延时都有固定的时间要求,可以用以下的方法:
首先确定在延时期间最多有几个A事件回发生,设计时用n ...

这样实现的话计数器可能需要很多了,相对而言采用fifo的方式应该更加灵活
页: [1]
查看完整版本: 关于信号的延时