do_gettimeofday() в Beaglebone выдает неправильное время

Я пытаюсь измерить период времени прямоугольной волны на 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));
    }

}

person user1971707    schedule 21.03.2013    source источник
comment
Интервал времени не может быть неправильным, как вы утверждаете. Ваш код пытается получить блокировку (путем вызова do_gettimeofday()) в ISR.   -  person sawdust    schedule 21.03.2013
comment
Спасибо за ответ. Но я не понимаю, как получение блокировки приводит к такому поведению. Не могли бы вы объяснить?   -  person user1971707    schedule 21.03.2013
comment
Попытка получить блокировку в ISR опасна, если эта блокировка может удерживаться другим ISR. Существует вероятность тупика, если не неожиданных задержек.   -  person sawdust    schedule 21.03.2013
comment
Привет. Как бы вы спроектировали прерывание, чтобы оно измеряло ширину импульса. Я должен измерять ширину импульса до 250 мкс. В настоящее время, используя этот подход, я могу правильно измерить ширину импульса, если она выше, около 10 мс.   -  person user1971707    schedule 23.03.2013


Ответы (1)


Для профилирования задержки прерывания я считаю весьма полезным полениться и установить вывод GPIO, а затем измерить время с помощью осциллографа. Вероятно, это не тот ответ, который вам нужен, но он может помочь вам быстро преодолеть препятствие.

person Jadon    schedule 31.03.2013