Вычисление количества прерываний в течение 1 секунды из контекста процесса

У меня есть требование, где мне нужно рассчитать количество прерываний, которые происходят в течение 1 секунды. Я планирую иметь подход ниже

Контекст процесса:

atomic_set(&irq_enblflg, 1);
//enable IRQ flg and sleep for 1 sec.
mdelay(1000);//maybe we can look for altenative later on
atomic_set(&irq_enblflg, 0);

Контекст прерывания:

static irqreturn_t tach_isr(int irq, void *d)
{
        //printk(KERN_CRIT "ISR#########\n");
        if (atomic_read(&irq_enblflg)) {
            pulse++;
        }
        return IRQ_HANDLED;
}

Я включу irq_enblflg и спать в течение 1 секунды из контекста процесса всякий раз, когда я хочу вычислить количество импульсов.

Кто-то может прокомментировать, является ли спящий в контексте процесса правильным подход для расчета количества прерываний в течение секунды, или есть какой-то лучший подход?

1 ответ

Ну, это зависит от того, atomic_read приостановит ваш код прерывания в ожидании доступности общей переменной. Если это произойдет, вы закончите блокировкой в ​​вашем коде прерывания и прерывания отключены, это опасно.

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

Это плохая идея блокировать обработчик прерываний, вы можете сделать это, например, только во FreeBSD, где обработчики прерываний запускаются с контекстом (как процесс) или когда у вас есть некоторые средства спин-блокировки (занятого ожидания в цикле), чтобы вы может подождать, но не выходя из контекста, поскольку прерывания обычно выполняются в контексте процесса, который они прерывают.

Другие вопросы по тегам