2 posts / 0 new
Last post
z20121202038
Offline
Last seen:3 years 11 months ago
加入:2016-03-30 12:51
关于软件定时器

你好,
有几个问题想咨询一下:
1)在task A下创建多个定时器,分别属于TASK A , TASK B , TASK C,比如:
ke_timer_set(APP_A_TIMER, TASK_A, 500);
ke_timer_set(APP_B_TIMER, TASK_B, 500);
ke_timer_set(APP_C_TIMER, TASK_C, 500);
然后,这三个定时器的定时器处理函数都发在task A的文件下,这样有问题吗?

2)软件定时器,是不是只有它所属的任务不是disable状态的情况下,才会启动,一旦任务进入disable状态,这个定时器就不会工作了。举个例子:
ke_timer_set(APP_ABC_TIMER, TASK_ONE, 500);
当TASK_ONE进入disable状态后,即使在程序中执行 ke_timer_set(APP_ABC_TIMER, TASK_ONE, 500);,5s之后仍然不会执行定时器处理函数app_abc_timer_handle?

谢谢!

Keywords:
Device:
snowdream1
Offline
Last seen:7 months 2 weeks ago
Staff
加入:2014-08-17 14:25
关于timer的工作原理,简要说明如下:

关于timer的工作原理,简要说明如下:
ke_timer_set里面有三个参数,第一个是定时器的消息id,第二个是处理这个定时器消息id的Task,第三个是延迟时间。调用完之后,会将ID和TASK做为一个组合进行绑定,并且按照延时的时间长短插入到定时器队列里面。IP核会通过硬件中断触发,来设置相应的定时器消息,触发回调函数ke_timer_schedule,用于检查之前定时器队列里有没有超时项。如果有,取出来,发往之前需要接收定时器消息的Task。最后就是Task的消息处理函数,对这个定时器消息做相应处理。所以这个定时器的精确度还是很高的。

现在针对第一个问题,这样基本没问题。但是有一点注意,580的内核不是抢占式的,无法保证处理定时器的消息,是按照之前设定的顺序来,即A->B>C。
另外,就是如果某个任务处理消息时间过长,也会延后其他2个任务真正处理的时间。

第二个问题,看你timer消息的处理函数怎么写。如果你在disable状态下,不让接收任何消息,当然就不会执行了。