Я пытаюсь измерить период времени прямоугольной волны на Beaglebone под управлением ОС Angstrom. Я написал драйвер ядра для регистрации ISR, в котором я синхронизирую импульсы. Все работает нормально, но измеряемый интервал времени совершенно неправильный. Я использую функцию do_gettimeofday() для измерения времени. Когда я делаю то же самое в программе пользовательского пространства, используя функцию poll(), я могу получить правильные значения (оно показывает около 1007 мкс для волны 1000 мкс), но когда я использую драйвер для измерения пульса, я получаю интервал как 1923 г. США. Я понятия не имею, почему временной интервал в ядре выше, чем в пользовательском пространстве. Я прикрепил свой код ниже. Буду признателен, если кто-нибудь найдет ошибку в моей программе.
ISR ядра:
static irqreturn_t ISR ( int irq, void *dev_id)
{
prev = c;
do_gettimeofday(&c);
printk(KERN_ALERT "%ld", (c.tv_usec - prev.tv_usec));
return IRQ_HANDLED;
}
пользовательская программа:
while(1){
prev = start;
gettimeofday(&start, NULL);
rc = poll(&fdset, 1, 20000);
if(rc < 0){
printf("Error in rc\n");
return -1;
}
if(rc == 0){
printf("Timed out\n");
return -1;
}
if (fdset.revents & POLLPRI) {
len = read(fdset.fd, buf, 2);
printf("%ld\n", (start.tv_usec - prev.tv_usec));
}
}
do_gettimeofday()
) в ISR. - person sawdust   schedule 21.03.2013