Я узнал, что 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 ())