#qt #yocto #imx6 #sysfs
Вопрос:
Я пытаюсь сделать спидометр с помощью датчика геркона на SoC на базе NXP iMX6UL под управлением Yocto Pyro 2.3.4 и Qt 5.9 (связанный вопрос на форуме Qt)
У меня есть это программное обеспечение, которое сообщает мне, как далеко друг от друга происходят два последующих прерывания, что отлично работает для сигнала 10-20 Герц:
int main() {
struct pollfd myPollfd;
struct timespec start, end;
int len;
unsigned long delta_us;
char *buf[BUF_SIZE];
system("echo falling > /sys/class/gpio/GPIO_IN/edge");
myPollfd.fd = open("/sys/class/gpio/GPIO_IN/value", O_RDONLY);
myPollfd.events = POLLPRI;
clock_gettime(CLOCK_MONOTONIC_RAW, amp;start);
while (1) {
poll(amp;myPollfd, 1, -1);
if(myPollfd.revents amp; POLLPRI) {
clock_gettime(CLOCK_MONOTONIC_RAW, amp;end);
len = read(myPollfd.fd, buf, BUF_SIZE);
delta_us = (end.tv_sec - start.tv_sec) * 1000000 (end.tv_nsec - start.tv_nsec) / 1000;
printf("time taken: %d usn", delta_us);
clock_gettime(CLOCK_MONOTONIC_RAW, amp;start);
}
lseek(myPollfd.fd, 0, 0);
}
close(myPollfd.fd);
return 0;
}
Проблемы возникают, если я также запускаю это приложение Qt, которое просто выводит изображение на экран:
#include <QSplashScreen>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QPixmap pixmap(":images/logo.jpg");
QSplashScreen splash(pixmap);
splash.show();
return a.exec();
}
Что происходит, так это то, что sysfs начинает случайным образом пропускать прерывания, в частности, я иногда получаю 2 прерывания, выполняемых спина к спине, и мое приложение на языке си показывает ровно половину разницы в реальном времени между двумя событиями для каждого из двойных прерываний.
Так, например, если я запускаю сигнал с периодом 200 мс, иногда прерывание сигнала будет отображаться как два прерывания, каждое на 100 мс от своего предшественника.
Приложение Qt было больше, но мне удалось отследить проблему до самого факта его запуска, независимо от того, насколько это просто.
Еще более неприятным является тот факт, что даже при отключении приложения Qt проблема сохраняется до следующей перезагрузки SoC.
События генерируются с помощью реле, подключенного к микроконтроллеру, поэтому частота фиксирована.
Я ищу известные ошибки/проблемы для sysfs или способ дальнейшей изоляции проблемы.