我想设置用于输入键的计时器和一个用于关闭灯的计时器,但它使用我设置的第一个计时器,我不能设置多个计时器而第二个计时器不起作用。 / p>
我使用下面的代码
int timer1, timer2;
long events;
timer1 = set_timer(8000, EVT_TIMER);
timer2 = set_timer(5000, EVT_TIMER);
while(1){
events = wait_event();
if(events & EVT_KBD){
clr_timer(timer1);
break;
}
else if (events & EVT_TIMER)
{
printf("TIME_OUT");
break;
}
while(1){
events = wait_event();
if(events & EVT_KBD){
clr_timer(timer2);
break;
}
else if (events & EVT_TIMER)
{
printf("TIME_OUT2");
break;
}
}
答案 0 :(得分:1)
如果要将它们捕获为不同的事件,则需要使用不同的事件掩码(EVT_TIMER)。棘手的是你需要小心你使用它,因为它可能触发其他动作。这些事件在svc.h
中定义(请注意,掩码是long
,long
被定义为32位,所以你真的没有留下任何东西使用标准事件。
好消息是set_timer
会返回一个ID(您的代码中包含timer1
和timer2
的内容)。然后,您可以使用SVC_TICKS
API来确定哪个计时器已过期。我写了一个名为" timeRemains"的包装器。帮助我。
//First, define "timeRemains"
char timeRemains(long* timer)
{
return SVC_TICKS(0, timer);
}
//Here's what your code may look like:
if(!timeRemains(&timer1))
{
//timer1 has expired. Do whatever you wanted to do when that happens.
//NOTE: you don't know the state of timer2--it may also have expired,
// so you will need to deal with that
}
if(!timeRemains(&timer2))
{
//timer2 has expired. Do whatever you wanted to do when that happens.
//NOTE: even though we are PRETTY sure that timer1 has not yet expired,
// you can't just forget about it. If you are going to exit this polling loop,
// be sure to clear it first.
}
答案 1 :(得分:0)
另一种方法是将您的计时器保留在您自己的数据结构中(比如按计时器到期时间排序的排序列表),并且只使用一个系统计时器来使第一个计时器到期(即排序列表中的第一个)。
当您收到EVT_TIMER
系统事件时,您将触发过期时间过去的所有计时器(从排序列表中删除它们)。
如果列表中还有剩余计时器,则启动新的系统计时器,以使新的第一个计时器到期。
至少有两件事需要注意:
添加新计时器时,必须检查它是否未成为第一个到期的计时器。如果是这样,您必须使用clr_timer()
取消现有的系统计时器,并为新的第一个计时器设置一个新的系统计时器(新添加的计时器,现在是排序列表中的第一个)。在将新计时器添加到空列表时跳过clr_timer()
调用(因为现在应该没有系统计时器处于活动状态)
如果您使用read_ticks()
调用来计算计时器到期时间(或其他任何内容),请务必处理它的值溢出回零的情况(每49.7发生一次)天)