4 posts / 0 new
Last post
z20121202038
Offline
Last seen:3 years 8 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:4 months 6 days 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状态下,不让接收任何消息,当然就不会执行了。

z20121202038
Offline
Last seen:3 years 8 months ago
加入:2016-03-30 12:51
你好,

你好,
“在disable状态下,不让接收任何消息”,这个是指?一般怎么配置disable状态下的情况,一般不就是配置ke_state_set(TASK_APP_A, A_HT_IDLE); 这样任务A就进入了disable状态(或者说IDLE)状态,这种状态下,默认还能接受消息吗?意思是不是IDLE状态下,default_state的消息还是能处理的?如果是这样,定时器的消息处理放在default_state下,那它挂着任务A或任务B是不是就没区别了啊?那是不是我可以把所有定时器都挂到APP_TASK下?
static const struct ke_msg_handler app_A_default_state[] =
{
……
};
另外一个问题,那如果我要进入低功耗模式,我就得让应用层任务及时进入IDLE状态,那这个时候定时器实际上还是在跑的吧,定时器时间到了,会自动退出低功耗模式,低功耗处理函数完毕就会重新判断是否所有任务都处于IDLE模式,如果是,就再次进入低功耗模式?
非常感谢!

snowdream1
Offline
Last seen:4 months 6 days ago
Staff
加入:2014-08-17 14:25
关于Task的消息处理,调用函数ke_state

关于Task的消息处理,调用函数ke_state_set设置完状态后,那么之后处理消息首先只会在相应的处理函数里面,如果找不到,则会走default handler处理流程。
所以当ke_state_set(TASK_APP_A, A_HT_IDLE),依然会处理消息。

另外,timer你放在哪个任务都行,之前的帖子有误,timer消息是放在一个单独的队列里面。和别的发送和接收消息队列是区分开的。

关于低功耗模式,调用ke_timer_set设置的定时器都会在跑。但是判断是否进入睡眠的第一个条件就是kernel数据发送和接收队列里面有没有待处理的消息,所以此时应用层任务不能还有未处理的消息。