搜索
bottom↓
回复: 72

分享&讨论:用一个定时器实现多个虚拟定时器方法

  [复制链接]

出0入0汤圆

发表于 2016-1-7 20:33:26 | 显示全部楼层 |阅读模式
最近在搞CANopen,使用CANfestival开源代码,发现它的时间调度有点意思,决定研究研究。
有幸拜读此贴:http://bbs.21ic.com/forum.php?mod=viewthread&tid=878522得知CANfestival的时间调度是:用一个定时器模拟多个浮动定时器。
于是就找了此博客:http://blog.chinaunix.net/uid-11897698-id-2803204.html(感谢博主wjtt),仔细研究这篇文件发现有几个数据解释不通,怎么都无法理解,如图示:

经过XX时间分析,觉得这个是错的,然后画出结构图并对文章做出修改。如果原博文是对的,请广大网友批评指正,感谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-1-7 20:53:27 | 显示全部楼层
感谢分享!!!

出0入0汤圆

发表于 2016-1-7 21:46:10 | 显示全部楼层
本帖最后由 myqiang1990 于 2016-1-7 21:56 编辑

一直用这种方式来模拟无限个定时器用在加速步进电机上~~其实这种方式模拟出来的才是真正的意义上的软定时器~~其特点是产生中断的频率是可变的~~我们一般做软定时器~都是中断频率固定,比如1ms然后再在中断内进行软件计数周期来获取频率~一般RTOS模拟软定时器就是这种方式~~我曾经给一位朋友解释过这种方式~~一般人很难想得到这种模拟定时器的方式~~
首先:要确定一点:就是硬件定时器的运行频率是固定的,然后控制硬件定时器的计时周期来获取不同的频率~从而获取不同的中断频率~~而互不影响~
假设,我们初始化硬件定时器运行频率是10HZ,我们现在要产生1HZ,2HZ,3HZ的不同运行频率(即中断频率),首先创建几个软定时器结构,并为每个软定时器赋一个周期值,分别为10(1HZ),5(2HZ),3(3HZ),那么在启动软定期后,先判断这3个软定时器的周期值,取最小周期那个先运行,选3HZ的先运行,因为3<5<10,现在开始计时,计时到3的时候,产生一个频率,那么这个时候3-3=0,所以3HZ的定时器动作,然后重新给这个3HZ的软定时器装周期值 = 3,剩下两个软定时器所需周期个数分别是10-3=7,5-3=2,
这个时候在对着三个软定时器周期进行大小判断,取最小那个,进行运行,2<3<7,所以选2HZ那个定时器的周期进行运行,当硬件定时器计时到2后产生中断,然后重复上面的步骤。

硬件定时器计数周期值取值原则就是:取软定时器剩下的周期值最小那个周期进行运行。动作原则是:软定时器周期数 - 已经运行的周期数 = 0.就可以动作改定时器,然后从新装初始化值该软定时器的周期值,然后每次中断,都将每个软定时器的周期值 - 已经运行的周期值 = 剩下所需要的运行周期值,然后在进行周期值比对,选最小那个来给硬件定时器计数(就是重装值)。

出0入0汤圆

发表于 2016-1-7 22:13:31 | 显示全部楼层
myqiang1990 发表于 2016-1-7 21:46
一直用这种方式来模拟无限个定时器用在加速步进电机上~~其实这种方式模拟出来的才是真正的意义上的软定时器 ...


请教,目前哪个能达到2A的电流的电机驱动芯片?同时提供测电流大小的功能,能否帮忙推荐1、2 ;

出0入0汤圆

发表于 2016-1-7 22:18:07 | 显示全部楼层
本帖最后由 myqiang1990 于 2016-1-7 22:19 编辑
kinsno 发表于 2016-1-7 22:13
请教,目前哪个能达到2A的电流的电机驱动芯片?同时提供测电流大小的功能,能否帮忙推荐1、2 ; ...


多得是啊~~给你推荐一个吧~lm6205~~控制电流~可以通过控制PWM占空比实现~0%--100%随便调~看错了,是测电流大小?我没见过能测电流大小的IC,测电流大小,不能用测电流的仪器来测吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-1-7 22:19:28 | 显示全部楼层
myqiang1990 发表于 2016-1-7 22:18
多得是啊~~给你推荐一个吧~lm6205~~控制电流~可以通过控制PWM占空比实现~0%--100%随便调~
...

兄弟,同时可以测电流啊,因为我会通地电流来判断电机是否阻塞了,会自动停止的;你忘了这条啊;

出0入0汤圆

发表于 2016-1-7 22:21:56 | 显示全部楼层
本帖最后由 myqiang1990 于 2016-1-7 22:37 编辑
kinsno 发表于 2016-1-7 22:19
兄弟,同时可以测电流啊,因为我会通地电流来判断电机是否阻塞了,会自动停止的;你忘了这条啊; ...


已经更新了,我以为是控制控制电流~测电流好像没哪个IC有这样的功能吧~~检测过流到时有的~比如DRV8841就有这样的功能~~其他,我暂时没发现哦~检测堵塞,不能加一个编码器吗?还有,如果没有这样的IC,我觉得你可以自己在IC的电流取样管脚,自己搭一个电路进行取样嘛~~你看8711可不可以,有停止转动的检测,不过这IC没有内置H桥,需要自己加~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2016-1-7 22:52:00 | 显示全部楼层
假设当前硬件定时器中断时间为1MS,并把这些虚拟定时器以及处理函数都放在中断中,那么虚拟定时器里的所有处理函数执行的总时间必须小于1MS,否则会引起定时不准,会出现这样的问题吧?一般的处理函数在1MS内不能执行完吧?

出0入0汤圆

发表于 2016-1-7 23:09:19 | 显示全部楼层
软定时器mark

出0入10汤圆

发表于 2016-1-7 23:11:50 | 显示全部楼层
构成软件定时器:1.分频;2.多个软件定时器的管理。

出0入0汤圆

发表于 2016-1-7 23:57:53 来自手机 | 显示全部楼层
可以在定时器中断里面模拟多个定时器吗?(手机看不到楼主的东西,只能猜测)

出0入0汤圆

发表于 2016-1-8 08:21:09 | 显示全部楼层
myqiang1990 发表于 2016-1-7 22:21
已经更新了,我以为是控制控制电流~测电流好像没哪个IC有这样的功能吧~~检测过流到时有的~比如DRV8841就 ...

thanks very much!

出0入0汤圆

发表于 2016-1-8 08:54:13 | 显示全部楼层
感觉好象会不准。有累积误差吧。

出20入26汤圆

发表于 2016-1-8 09:15:57 | 显示全部楼层
楼主,主从站都做吗?我现在也在搞,刚入门

出0入0汤圆

 楼主| 发表于 2016-1-8 09:24:35 | 显示全部楼层
myqiang1990 发表于 2016-1-7 21:46
一直用这种方式来模拟无限个定时器用在加速步进电机上~~其实这种方式模拟出来的才是真正的意义上的软定时器 ...

这个回帖好像在哪里见到过O(∩_∩)O。
你的这种方式是若干个虚拟定时器同时启动,属于浮动定时法的一种情况。
文章中提到的可以在任意时刻启动任意一个虚拟定时器,更灵活。

出0入0汤圆

 楼主| 发表于 2016-1-8 09:26:45 | 显示全部楼层
PICTURE 发表于 2016-1-7 22:52
假设当前硬件定时器中断时间为1MS,并把这些虚拟定时器以及处理函数都放在中断中,那么虚拟定时器里的所有 ...

中断函数一般都需要精简,快入快出,所以定时时间到,设置一个标志位,然后在主循环做要处理的事情。

出0入0汤圆

 楼主| 发表于 2016-1-8 09:27:25 | 显示全部楼层
yick 发表于 2016-1-7 23:57
可以在定时器中断里面模拟多个定时器吗?(手机看不到楼主的东西,只能猜测) ...

是这样滴

出0入0汤圆

 楼主| 发表于 2016-1-8 09:33:24 | 显示全部楼层
dongwang_fl 发表于 2016-1-8 08:54
感觉好象会不准。有累积误差吧。

误差肯定有的,不可能达到硬件定时器的精确度。在你项目实时性误差允许范围内当然可以才用。
还有其他虚拟定时方式,最简单的就是做个基本定时器,中断里变量递增,主循环查询。

出0入0汤圆

 楼主| 发表于 2016-1-8 09:34:51 | 显示全部楼层
jufr12315 发表于 2016-1-8 09:15
楼主,主从站都做吗?我现在也在搞,刚入门

静下心来慢慢搞,学会了是自己的。

出0入0汤圆

发表于 2016-1-8 09:50:45 | 显示全部楼层
myqiang1990 发表于 2016-1-7 21:46
一直用这种方式来模拟无限个定时器用在加速步进电机上~~其实这种方式模拟出来的才是真正的意义上的软定时器 ...

linux的timer就是这种思路了,也就是说这已经是很老的方式,只不过使用的人不一定多

出0入4汤圆

发表于 2016-1-8 09:55:06 | 显示全部楼层
short ticks;  // 这个视定时长度来决定用8位还是16位还是32位的变量
void timer_isr(void)
{
  ticks++;
  …………
}
#define _DELAY_1S     xxxx
short period0;
void task0(void)
{
  if(ticks > period0){
    period0 += _DELAY_1S;
    do something;
}
}

void main(void)
{
    period0 = ticks + _DELAY_1S;
    while(1){
      task0();
      …………
    }
}

出0入0汤圆

发表于 2016-1-8 10:02:49 | 显示全部楼层
软件定时器。

出0入0汤圆

发表于 2016-1-8 10:41:42 | 显示全部楼层
本帖最后由 myqiang1990 于 2016-1-8 10:49 编辑
xld826 发表于 2016-1-8 09:24
这个回帖好像在哪里见到过O(∩_∩)O。
你的这种方式是若干个虚拟定时器同时启动,属于浮动定时法的一种情 ...


你不可能在哪里见过吧?我昨天原创,自己码的字~ ~也可以任意启动~不一定是同时启动~~只不过我描述得不是很清晰~~可以任意启动~任意修改周期值~这只是软件实现上的问题了~~反正和你说得应该是一样一样的~~
你想想,如果不能任意启动,任意停止,怎么单独控制每个电机的加减速呢~

出0入0汤圆

发表于 2016-1-8 10:44:49 | 显示全部楼层
changer15309 发表于 2016-1-8 09:50
linux的timer就是这种思路了,也就是说这已经是很老的方式,只不过使用的人不一定多 ...

有可能,没研究过LINUX,

出0入0汤圆

发表于 2016-1-8 10:49:35 | 显示全部楼层
PICTURE 发表于 2016-1-7 22:52
假设当前硬件定时器中断时间为1MS,并把这些虚拟定时器以及处理函数都放在中断中,那么虚拟定时器里的所有 ...

肯定有误差,任何定时都有误差~毕竟你要进中断--执行程序--退中断,所以必定有误差~~只是看中断延迟多久来评估好与坏啦~

出0入0汤圆

 楼主| 发表于 2016-1-8 12:10:30 | 显示全部楼层
myqiang1990 发表于 2016-1-8 10:41
你不可能在哪里见过吧?我昨天原创,自己码的字~ ~也可以任意启动~不一定是同时启动~~只不过我描 ...

奇怪了,总感觉面熟

出0入89汤圆

发表于 2016-1-8 12:15:46 | 显示全部楼层
其实,如果你了解 libev等库,就明白了,最小堆配合这个技术,最好大家看看。

出0入0汤圆

发表于 2016-1-8 14:30:10 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-1-8 14:33:41 | 显示全部楼层
Thank you !!

出0入0汤圆

发表于 2016-1-8 14:36:25 | 显示全部楼层
mark一下

出20入26汤圆

发表于 2016-1-9 12:56:21 | 显示全部楼层
xld826 发表于 2016-1-8 09:34
静下心来慢慢搞,学会了是自己的。

好,还望多指教

出0入0汤圆

发表于 2016-1-9 14:09:48 | 显示全部楼层
收藏了,有空研究下

出0入0汤圆

发表于 2016-1-12 08:51:56 来自手机 | 显示全部楼层
21楼我在用,方便,灵活

出20入26汤圆

发表于 2016-1-13 10:29:40 | 显示全部楼层


楼主你好,有个问题请教下你。
一、从站是怎么接收CAN总线上的数据?
现在有一个从站,节点COBID = 0X01,
节点0x01的对象字典配置了PDO,接收的是主机的PDO,
现在主机发送PDO到总线上,接下来,节点0x01,就会收到
主机的PDO(1.节点是怎么样的接收流程?如图,是canfestival的部分代码
,这个函数在中断调用,只要有数据,就会进入这个函数,然后,我只需在对
应的RPDO做数据处理就好吗?处理索引1603H定义的数据是在对象字典的索引2000H
这样吗?)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-1-13 12:19:20 | 显示全部楼层
jufr12315 发表于 2016-1-13 10:29
楼主你好,有个问题请教下你。
一、从站是怎么接收CAN总线上的数据?
现在有一个从站,节点COBID = 0X01 ...

一、从站是怎么接收CAN总线上的数据?
Q:从机通过CAN中断接受数据。
现在有一个从站,节点COBID = 0X01,
节点0x01的对象字典配置了PDO,接收的是主机的PDO,
现在主机发送PDO到总线上,接下来,节点0x01,就会收到
主机的PDO(1.节点是怎么样的接收流程?
Q:从机通过CAN中断接受数据。然后调用canDispatch处理接收到的数据。
如图,是canfestival的部分代码
,这个函数在中断调用,只要有数据,就会进入这个函数,然后,我只需在对
应的RPDO做数据处理就好吗?处理索引1603H定义的数据是在对象字典的索引2000H
这样吗?
Q:处理RPDO是协议栈查找字典处理,你只需要处理接收到的数据。接收到的数据存放在RPDO对应的映射的变量里面。


下次提问先总结下,这样好乱。。。

出0入0汤圆

发表于 2016-1-13 12:22:55 来自手机 | 显示全部楼层
学习了,…

出0入8汤圆

发表于 2016-1-13 12:30:45 来自手机 | 显示全部楼层
c++比较好实现

出20入26汤圆

发表于 2016-1-13 12:31:39 | 显示全部楼层
xld826 发表于 2016-1-13 12:19
一、从站是怎么接收CAN总线上的数据?
Q:从机通过CAN中断接受数据。
现在有一个从站,节点COBID = 0X01, ...

谢谢回复,以后提问会注意了。

你说的我只需处理接收到的数据,就是在RPDO映射的变量里。

我只需在映射的变量里吧数据读取就可以,是这样?

中断调用canDispatch处理,接收到的RPDO是谁放到映射变量里的?

出0入0汤圆

 楼主| 发表于 2016-1-13 14:27:54 | 显示全部楼层
jufr12315 发表于 2016-1-13 12:31
谢谢回复,以后提问会注意了。

你说的我只需处理接收到的数据,就是在RPDO映射的变量里。


我只需在映射的变量里吧数据读取就可以,是这样?
Q:是的
中断调用canDispatch处理,接收到的RPDO是谁放到映射变量里的?
Q:具体放哪里看你怎么处理啦,可以变数组,可以放结构体,可以放缓存。

出20入26汤圆

发表于 2016-1-13 15:15:48 | 显示全部楼层
xld826 发表于 2016-1-13 14:27
我只需在映射的变量里吧数据读取就可以,是这样?
Q:是的
中断调用canDispatch处理,接收到的RPDO是谁放 ...

中断调用canDispatch处理,接收到的RPDO是放到映射变量里的?

是谁?
1、是不是这个协议栈已经写有对应的程序(协议栈将接收到的RPDO,根据OD映射的地址,写到对应里去了?)【我觉得这个是这样的】
2、还是需要我(开发者)将接收到的RPDO里的有效数据,根据OD映射的地址,放进去?

出0入0汤圆

 楼主| 发表于 2016-1-13 15:19:11 | 显示全部楼层
jufr12315 发表于 2016-1-13 15:15
中断调用canDispatch处理,接收到的RPDO是谁放到映射变量里的?

是谁?

协议栈根据OD映射放进去了

出20入26汤圆

发表于 2016-1-13 15:30:02 | 显示全部楼层
xld826 发表于 2016-1-13 15:19
协议栈根据OD映射放进去了

多谢了,现在比较清晰了

出0入53汤圆

发表于 2016-1-13 17:05:29 | 显示全部楼层
myqiang1990 发表于 2016-1-7 22:21
已经更新了,我以为是控制控制电流~测电流好像没哪个IC有这样的功能吧~~检测过流到时有的~比如DRV8841就 ...

请问国内做的直流有刷电机比较好的有哪些厂家?

出0入0汤圆

发表于 2016-1-13 17:25:09 | 显示全部楼层
感谢分享!!!mark

出0入0汤圆

发表于 2016-1-14 09:57:38 | 显示全部楼层
楼主,应该把你的定时器代码贴出来,大家看看。纯文字还有那两个连接,看得头大!

出0入0汤圆

 楼主| 发表于 2016-1-14 14:09:12 | 显示全部楼层
jiang887786 发表于 2016-1-14 09:57
楼主,应该把你的定时器代码贴出来,大家看看。纯文字还有那两个连接,看得头大! ...

直接看CANFestival 源码就可以了

出20入26汤圆

发表于 2016-1-22 20:13:17 | 显示全部楼层
楼主,我又来请教你了。
在CANFestival里面,我使用 从站1 监控 从站2 的心跳,如果从站2掉线了,从站1就会监控到,此时,从站1会提示什么不?或者从站1有处理函数没?

出0入0汤圆

发表于 2016-1-22 23:05:16 | 显示全部楼层
看懂了那篇博客,
第一种基本上单片机上实现的软件定时器都是这种,坏处不说了,好处就是新建定时器不需要和真实的定时器外设打交道,纯粹的软件操作,
第二种每次新建或者到期一个定时器都要重新操作一遍定时器外设,精度可能确实是这种比较高,但是pc上操作外设很可能要切换cpu运行模式啊,用户空间可以使用外设吗

出0入0汤圆

 楼主| 发表于 2016-1-23 16:34:37 | 显示全部楼层
jufr12315 发表于 2016-1-22 20:13
楼主,我又来请教你了。
在CANFestival里面,我使用 从站1 监控 从站2 的心跳,如果从站2掉线了,从站1就会 ...

从站怎么能监控从站呢?心跳是主站监控从站。节点守卫是主从站相互监控。没有从站之间相互监控。

出20入26汤圆

发表于 2016-1-23 19:45:11 | 显示全部楼层
xld826 发表于 2016-1-23 16:34
从站怎么能监控从站呢?心跳是主站监控从站。节点守卫是主从站相互监控。没有从站之间相互监控。 ...

1、不能从站监控从站?应该可以的啊。

2、那能从站监控主站不?

我觉得是这样的,不管主从站,它们的对象字典里的1016H就是消费心跳的配置,
既然有了这个,就可以监控另外的节点了。

3、那现在我在CANFestival用主站监控从站,主站是哪个函数来处理超时的节点呢?
或者这样说,就是我已经配置好了主站OD和从站OD(主监控从),但是,我在主
站中怎么来判断从站超时,CANFestival中有对应的处理函数吗?

谢谢指点!

出0入0汤圆

发表于 2016-1-24 20:12:56 | 显示全部楼层
changer15309 发表于 2016-1-8 09:50
linux的timer就是这种思路了,也就是说这已经是很老的方式,只不过使用的人不一定多 ...

请教下,linux下这个代码是哪个文件,自己找了下没找到.谢谢

出0入0汤圆

 楼主| 发表于 2016-1-26 11:51:40 | 显示全部楼层
jufr12315 发表于 2016-1-23 19:45
1、不能从站监控从站?应该可以的啊。

2、那能从站监控主站不?

1、从站只有生产,怎么相互监控?
2、采用节点守卫,从站可以监控主站。

出20入26汤圆

发表于 2016-1-26 17:55:12 | 显示全部楼层
xld826 发表于 2016-1-26 11:51
1、从站只有生产,怎么相互监控?
2、采用节点守卫,从站可以监控主站。 ...

据我了解从站是可以监控从站的。

这两天查了资料,请教了网友,说可以的。

出0入0汤圆

发表于 2016-1-26 21:04:41 | 显示全部楼层
youkebing 发表于 2016-1-8 12:15
其实,如果你了解 libev等库,就明白了,最小堆配合这个技术,最好大家看看。 ...

看了一下libev,愣是没看懂。明明c语言我都懂,还自认为挺精通,还请指教。
你说的最小堆和这个定时器有什么关系呢?谢谢

出0入0汤圆

 楼主| 发表于 2016-1-27 10:55:25 | 显示全部楼层
jufr12315 发表于 2016-1-26 17:55
据我了解从站是可以监控从站的。

这两天查了资料,请教了网友,说可以的。

还请赐教

出85入85汤圆

发表于 2016-1-28 07:43:21 来自手机 | 显示全部楼层
DS18b20是否可以要软定时器来驱动呢?

出20入26汤圆

发表于 2016-1-28 09:24:36 | 显示全部楼层

从站监控从站还是跟主站监控从站一样

出0入4汤圆

发表于 2016-1-28 11:56:39 来自手机 | 显示全部楼层
这个需要MARK!软定时受教了!

出0入0汤圆

发表于 2016-1-28 14:44:47 | 显示全部楼层
一直在用文中的这个“软”定时器,以前的老板教的

出0入0汤圆

 楼主| 发表于 2016-1-29 14:33:57 | 显示全部楼层
zwhzwh_11 发表于 2016-1-28 07:43
DS18b20是否可以要软定时器来驱动呢?

DS18B20跟软件定时器没有必然联系。遵循DS18B20时序即可驱动。

出0入0汤圆

发表于 2016-1-29 16:11:14 | 显示全部楼层
myqiang1990 发表于 2016-1-8 10:49
肯定有误差,任何定时都有误差~毕竟你要进中断--执行程序--退中断,所以必定有误差~~只是看中断延迟多久 ...

这种在STM32里只需要更改捕获值就行吧,累积误差应该不会有,按说。这样的话还可以保证定时器里面的时间基本上固定,但是要考虑定时器的最长定时时间,别溢出了就行吧。

出0入0汤圆

发表于 2016-5-24 21:15:30 | 显示全部楼层
myqiang1990 发表于 2016-1-7 21:46
一直用这种方式来模拟无限个定时器用在加速步进电机上~~其实这种方式模拟出来的才是真正的意义上的软定时器 ...

硬件定时器固定,软件定时器根据设定的定时时间自减感觉更方便,比如硬件定时器为1ms,需要10ms、30ms、50ms的定时器,根据硬件定时器的值自减

出0入0汤圆

发表于 2016-5-24 21:16:41 | 显示全部楼层
jiang887786 发表于 2016-1-14 09:57
楼主,应该把你的定时器代码贴出来,大家看看。纯文字还有那两个连接,看得头大! ...

同意,再看下代码可能比较好理解

出0入0汤圆

发表于 2016-5-24 21:17:21 来自手机 | 显示全部楼层
学习了,收藏

出0入0汤圆

发表于 2016-9-17 00:36:19 | 显示全部楼层
楼主的这个CANOPEN说的这种多个虚拟定时器有空研究下

出0入0汤圆

发表于 2017-4-11 00:38:44 | 显示全部楼层
学习受益了谢谢!!

出0入17汤圆

发表于 2017-4-12 13:33:50 | 显示全部楼层
被挖出来了,特意去看了下,貌似博客的没有错。
博客上的“假设还有1.2秒定时时间到,那么任务1对应虚拟定时器参数结构体[0]的定时时间还剩1.2秒,结构体[1]剩余定时时间3-(2-1.2)=2.2秒,”
你的PDF上“假设还有1.2秒定时时间到,那么任务1对应虚拟定时器参数结构体[0]的定时时间还剩1.2秒,结构体[1]剩余定时时间3-(2-1.2)+ 0.5=2.7秒”

硬件还剩1.2,初始定的是2,那就是走了0.8, 所以结构体1剩余2.2没错呀。

出0入0汤圆

发表于 2017-4-12 14:46:41 | 显示全部楼层
我记得我当时看lwip源码好像就是使用这种软定时器.重传定时器,保活定时器等都是基于一个硬件定时器产生的,它们通过链表连接起来.
只能说能看懂大概意思,让我写,说实话写不出来.
如果有需要使用的,或许可以参考下它的源码.
因为据说它的那个定时还比较准.为什么准,我就不知道了

出0入0汤圆

 楼主| 发表于 2017-4-14 12:50:22 | 显示全部楼层
本帖最后由 xld826 于 2017-4-14 19:19 编辑
newuseruser 发表于 2017-4-12 13:33
被挖出来了,特意去看了下,貌似博客的没有错。
博客上的“假设还有1.2秒定时时间到,那么任务1对应虚拟定 ...


接下来设置任务2,查找空闲虚拟定时参数结构体数组,就是结构体[1]了(虚拟定时器2),将定时值3秒写入结构体,再获得硬件定时器运行剩余时间,
假设还有1.5秒定时时间到,小于写入的3秒,硬件定时器继续运行,置参数结构体[1]的定时器状态为使用中,
则表示虚拟定时器2开始工作了,
最后设置任务3,查找空闲虚拟定时参数结构体数组,就是结构体[2](虚拟定时器2)了,将定时值1秒写入结构体,再获得硬件定时器运行剩余时间,
假设还有1.2秒定时时间到,那么任务1对应虚拟定时器参数结构体[0]的定时时间还剩1.2秒,结构体[1]剩余定时时间3-(2-1.2)=2.2秒

请注意这里:在写入任务2的3秒时候,任1务已经运行了0.5s。
所以当任务1还剩1.2s的时候,任务2应该比任务1多剩0.5s。

出0入0汤圆

发表于 2017-4-14 15:28:27 | 显示全部楼层
收藏了,学习学习  

出0入17汤圆

发表于 2017-4-15 23:08:24 | 显示全部楼层
xld826 发表于 2017-4-14 12:50
接下来设置任务2,查找空闲虚拟定时参数结构体数组,就是结构体[1]了(虚拟定时器2),将定时值3秒写入结 ...

博客今天打不开,看了你的PDF,你说的是对的。

原作者写得太绕了,原博客我只看到了2.2那里,截止这里,任务2.剩余时间的计算是有任务1.定时值参与的,很容易让人认为是起始对齐的定时任务。后面又出现了总定时间参与计算,再后面又没有了,绕!
对于一个随机起始的定时任务,其它定时器的定时值跟自己没有关系,所以计算方法如果不是3-(2-1.2)=2.2(看公式就是起始对齐),如果也不是3-(2-1.2)+ 0.5=2.7 ,而是3-(1.5-1.2)=2.7(1.5是起始时的硬件定时器值)的话,可能会好理解很多。
看PDF,好像意思是每次启动新定时器都应该更新所有启动的定时器的,所以启动任务2的时候,应该写任务1.剩余时间=2-(2-1.5)=1.5(一个2是定时值,一个2是起始的硬件定时器值)。

还是3楼说的简单一点,原理明白了,每个人根据自己的习惯选择实现方法。

出0入0汤圆

 楼主| 发表于 2017-4-16 21:45:28 | 显示全部楼层
newuseruser 发表于 2017-4-15 23:08
博客今天打不开,看了你的PDF,你说的是对的。

原作者写得太绕了,原博客我只看到了2.2那里,截止这里, ...

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-27 03:33

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

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