Почему ppoll () не дождался моей задержки в Android P ie? - PullRequest
1 голос
/ 05 марта 2020

Я узнал, что l oop, который проверяет прерывание GPIO, которое, как предполагается, составляет l oop при ~ 100 при использовании c, фактически зацикливается на каждые 3 использования c. Причина в том, что временной интервал c, который я дал, процедура ожидания события GPIO не работает. Время ожидания мгновенно истекает.

(обратите внимание, что я удалил дополнительный код, обработку ошибок и другие функции, типичные для al oop ... например, как выйти из l oop)

struct timespec timeSpec = { 0, 100000 };  // sec, nanosec

struct gpiod_line_event event;
for (;;)
{

   result = gpiod_line_event_wait(pGpioLine, &timeSpec);    // ppoll(....timeSpec) is called inside this wait() 
   if (result > 0)
   {

      // GPIO IRQ detected
       if (gpiod_line_event_read(pGpioLine, &event) >= 0)

      {
         HandleIrq();

      }
   }
   else
   {
      //  100 usec timeout

      HandleTimeout()
   }

}

Я пытался обойти неудачу, чтобы правильно ждать, используя много подходов. Добавление усли (1); к л oop не работает. Фактическое время сна составляет от 30 до 40 мсек c, что слишком много для нашего водителя. Это не было неожиданностью, так как это не ОС реального времени.

Я попытался изменить timeSpe c, чтобы иметь абсолютное значение вместо относительного времени. Например, я попытался создать свое собственное ожидание на основе часов REAL_TIME.

struct timespec timeToWait;

   clock_gettime(CLOCK_REALTIME, &timeToWait);

   timeToWait.tv_nsec += 10000000UL;

    result = gpiod_line_event_wait(pGpioLine, &timeToWait);

Это не сработало, и я в итоге пришел к выводу, что временной коэффициент c должен быть относительным для этого API gpiod. (API на самом деле ppoll ())

...