Как установить более одного таймера в verifyone vx520

Я хочу установить таймер для ввода ключа и один таймер для выключения подсветки, но он использует первый таймер, который я установил, и я не могу установить более одного таймера, а второй таймер не работает.

я использую код ниже

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;
}
}

2 ответа

Другой подход заключается в том, чтобы сохранить ваши таймеры в вашей собственной структуре данных (скажем, отсортированный список, упорядоченный по времени истечения таймера) и использовать только один системный таймер для первого таймера, который истекает (то есть первый в отсортированном списке).

Когда вы получите EVT_TIMER системное событие, вы запускаете все таймеры, время истечения которых прошло в прошлом (удаляя их из отсортированного списка).

Если в списке остается какой-либо таймер, вы запускаете новый системный таймер для истечения срока действия нового первого таймера.

Есть (по крайней мере) две вещи, о которых нужно знать:

  • при добавлении нового таймера вы должны проверить, не истек ли он первым таймером. Если это так, вы должны отменить существующий системный таймер с clr_timer() и установить новый системный таймер для истечения срока действия нового первого таймера (новый добавленный таймер, который теперь является первым в отсортированном списке). Пропустить clr_timer() вызов при добавлении нового таймера в пустой список (так как сейчас не должно быть активного системного таймера)

  • если вы используете read_ticks() вызов для расчета времени истечения таймера (или для чего-либо еще), убедитесь, что обрабатывает случай, когда его значение возвращается к нулю (что происходит каждые 49,7 дней)

Вам нужно использовать другую маску событий (EVT_TIMER), если вы хотите захватить их как разные события. Хитрость в том, что вы должны быть осторожны с тем, что вы используете, потому что это может вызвать другие действия. Эти события определены в svc.h (Обратите внимание, что маска является long и long определяется как 32-битный, так что у вас действительно ничего не остается после того, как все стандартные события используются).

Хорошая новость в том, что set_timer возвращает идентификатор (вот что 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.
}
Другие вопросы по тегам