你好,
有几个问题想咨询一下:
1)在任务下创建多个定时器,分别属于任务,任务B, 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);
然后,这三个定时器的定时器处理函数都发在任务的文件下,这样有问题吗?
2)软件定时器,是不是只有它所属的任务不是禁用状态的情况下,才会启动,一旦任务进入禁用状态,这个定时器就不会工作了。举个例子:
ke_timer_set (APP_ABC_TIMER TASK_ONE 500);
当TASK_ONE进入禁用状态后,即使在程序中执行ke_timer_set (APP_ABC_TIMER TASK_ONE 500);, 5 s之后仍然不会执行定时器处理函数app_abc_timer_handle吗?
谢谢!
关键词:
设备:
关于定时器的工作原理,简要说明如下:
第ke_timer_set里面有三个参数,一个是定时器的消息id、第二个是处理这个定时器消息id的任务,第三个是延迟时间。调用完之后,会将ID和做任务为一个组合进行绑定,并且按照延时的时间长短插入到定时器队列里面。IP核会通过硬件中断触发,来设置相应的定时器消息,触发回调函数ke_timer_schedule,用于检查之前定时器队列里有没有超时项。如果有,取出来,发往之前需要接收定时器消息的任务。最后就是任务的消息处理函数,对这个定时器消息做相应处理。所以这个定时器的精确度还是很高的。
现在针对第一个问题,这样基本没问题。但是有一点注意,580的内核不是抢占式的,无法保证处理定时器的消息,是按照之前设定的顺序来,即A - B > C >。
另外,就是如果某个任务处理消息时间过长,也会延后其他2个任务真正处理的时间。
第二个问题,看你计时器消息的处理函数怎么写。如果你在禁用状态下,不让接收任何消息,当然就不会执行了。