Part Number: AM3354
Hello,
we are running Linux 4.14.79-rt47 #2 with AM3354 and we are experiencing some strange behaviour related to real-timeness for gpio reading. The kernel is configured with CONFIG_PREEMPT_RT_FULL=y and HZ_1000=y.
Our SW reads gpio by using libgpiod every 1 ms and triggers a print when gpio levels changes, please find below the code.
We inject an input signal which is a square waveform with period equal to 300ms and dudty cycle as 50%.
Typically all edges are detected with a maximum error equal 2-3ms; but sometimes (about 1 over 30) we get an unexpected delay up to 50-150ms.
The application runs in FIFO scheduler with priority 98. The remaining threads run on the default scheduler.
// gpiod line initialization...
bool lastValue = gpiod_line_get_value(line) != 0;
bool value = lastValue;
uint64_t lastTs = 0;
while(!interrupted()) {
while(value == lastValue) {
struct timespec ts = { 0 };
ts.tv_nsec = 1000000;
int ret = -1;
while(ret != 0)
ret = nanosleep(&ts, &ts);
value = gpiod_line_get_value(line) != 0;
}
// Uses clock_gettime(CLOCK_REALTIME)
uint64_t ts = getMicrosecondsTimestamp();
BR
cout << "*** Breaker event: " << value << " - ts " << ts << " - diff " << ts - lastTs << " - groupID " << this->groupID << " ***" << endl;
lastTs = ts;
}
Below a small log from the application where you can see that the difference from the previous edge is much more than expected 150ms. In particular, in line no.7 we got about 202ms.
*** Breaker event: 1 - ts 1614014210177509 - diff 147579 - groupID 52707 ***
*** Breaker event: 0 - ts 1614014210330205 - diff 152696 - groupID 52708 ***
*** Breaker event: 1 - ts 1614014210478128 - diff 147923 - groupID 52709 ***
*** Breaker event: 0 - ts 1614014210629910 - diff 151782 - groupID 52710 ***
*** Breaker event: 1 - ts 1614014210777620 - diff 147710 - groupID 52711 ***
*** Breaker event: 0 - ts 1614014210930340 - diff 152720 - groupID 52712 ***
*** Breaker event: 1 - ts 1614014211133018 - diff 202678 - groupID 52713 ***
*** Breaker event: 0 - ts 1614014211230153 - diff 97135 - groupID 52714 ***
*** Breaker event: 1 - ts 1614014211377431 - diff 147278 - groupID 52715 ***
*** Breaker event: 0 - ts 1614014211529728 - diff 152297 - groupID 52716 ***
*** Breaker event: 1 - ts 1614014211677992 - diff 148264 - groupID 52717 ***
*** Breaker event: 0 - ts 1614014211829981 - diff 151989 - groupID 52718 ***
*** Breaker event: 1 - ts 1614014211977247 - diff 147266 - groupID 52719 ***
*** Breaker event: 0 - ts 1614014212130436 - diff 153189 - groupID 52720 ***
*** Breaker event: 1 - ts 1614014212278182 - diff 147746 - groupID 52721 ***
*** Breaker event: 0 - ts 1614014212429678 - diff 151496 - groupID 52722 ***
*** Breaker event: 1 - ts 1614014212577919 - diff 148241 - groupID 52723 ***
*** Breaker event: 0 - ts 1614014212730462 - diff 152543 - groupID 52724 ***
*** Breaker event: 1 - ts 1614014212877560 - diff 147098 - groupID 52725 ***
*** Breaker event: 0 - ts 1614014213030037 - diff 152477 - groupID 52726 ***
*** Breaker event: 1 - ts 1614014213177286 - diff 147249 - groupID 52727 ***