Расчет количества прерываний в течение 1 секунды из контекста процесса - PullRequest
0 голосов
/ 29 октября 2018

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

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

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 Ответ

0 голосов
/ 30 октября 2018

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

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

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

...