Имейте перезапуск таймера каждые 100 мс в C / C ++

0

Я работаю с приложением, где требование выполняет функцию через каждые 100 мс. Ниже мой код

checkOCIDs()
{
// Do something that might take more than 100ms of time
}
void TimeOut_CallBack(int w)
{
    struct itimerval tout_val;
    int ret = 0;

    signal(SIGALRM,TimeOut_CallBack);

    /* Configure the timer to expire after 100000 ... */
    tout_val.it_value.tv_sec = 0;
    tout_val.it_value.tv_usec = 100000; /* 100000  timer */

    /* ... and every 100 msec after that. */
    tout_val.it_interval.tv_sec = 0 ;
    tout_val.it_interval.tv_usec = 100000;

    checkOCIDs();

    setitimer(ITIMER_REAL, &tout_val,0);

    return ;

}

Функция TimeOut_CallBack() вызывается только один раз, а затем функция checkOCIDs() должна выполняться после непрерывного ожидания 100 мс. В настоящее время приложение работает для блока, поскольку функция checkOCIDs() занимает более 100 мс времени, и до этого запускается таймер. Я не хочу использовать while (1) со сном()/usleep(), поскольку он сильно поглощает мой процессор. Пожалуйста, предложите альтернативу для выполнения моих требований.

  • 0
    Требование ошибочно. Если у вас есть жесткое требование в реальном времени запускать Foo() каждые N миллисекунд, у вас есть подразумеваемое требование, что Foo должен работать в течение 100 мс. Если Foo() находится вне вашего контроля, вы не можете указать требования для Foo , даже косвенно. Кроме того, требование подразумевает, что вы не можете использовать Foo .
  • 0
    Ага !! Вы правы ... выполнение функции-обработчика не в моем контроле. Я имел в виду, что функция checkOCIDs () должна выполняться непрерывно после задержки в 100 мс (после завершения каждого выполнения - delay - execute - delay -execute -delay).
Теги:
timer

1 ответ

0

Неясно, должна ли выполняться функция "проверка" во время ее выполнения, а таймер истекает. Возможно, было бы хорошо, если бы вы представили переменную, указав, что таймер истек, и ваша функция должна быть выполнена снова после ее завершения, псевдокод:

static volatile bool check_in_progress = false;
static volatile bool timer_expired = false;

void TimeOut_CallBack(int w)
{
    // ...
    if (check_in_progress) {
        timer_expired = true;
        return;
    }

    // spawn/resume check function thread
    // ...
}

void checkThreadProc()
{
    check_in_progress = true;
    do {
        timer_expired = false;
        checkOCIDs();
    } while(timer_expired);
    check_in_progress = false;

    // end thread or wait for a signal to resume
}

Обратите внимание, что для предотвращения условий гонки может потребоваться дополнительная синхронизация (например, когда один поток существует, а цикл while и check_in_progress все еще установлен, а другой устанавливает timer_expired, функция проверки не будет выполнена), но это зависит от ваших требований.

  • 0
    Спасибо "frymode" :-) Просто чтобы прояснить ваши сомнения, идеальная работа, которая ожидается, это выполнить checkOCIDs () ждать 100 мс, снова checkOCIDs () ждать 100 мс, а затем это должно продолжаться. Моя текущая реализация не так :-(. Использование переменных, как предложено выше, будет полезно, так как это должно быть в цикле. Я ищу что-то вроде операций таймера перезапуска / тайм-аута, соответствующих тому, как это ожидалось в моих требованиях ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню