Вычисление количества прерываний в течение 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, где обработчики прерываний запускаются с контекстом (как процесс) или когда у вас есть некоторые средства спин-блокировки (занятого ожидания в цикле), чтобы вы может подождать, но не выходя из контекста, поскольку прерывания обычно выполняются в контексте процесса, который они прерывают.