- Определите прерывание по нарастающему и заднему фронту на одном выводе GPIO.
- выполните чтение i2c с другого датчика (при обнаружении нарастающего фронта).
- при спадающем фронте выполните небольшое выполнение для расчета времени.
result = request_threaded_irq(irqNumber, (void *)r_irq_handler, irq_interrupt_thread_fn, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "irqHandler", NULL);
Здесь каждые 50 мс мы получаем одно прерывание по этому GPIO. Длительность импульса этого сигнала прерывания составляет 10 мс. Таким образом, каждые 50 мс обработчик IRQ будет выполняться 2 раза. Один раз для нарастающего фронта, и через 10 мс он выполнит обработчик IRQ для падающего фронта.
Таким образом, тестируя реализацию, я столкнулся с несколькими неожиданными вариантами поведения irqHandler.
как показано ниже.
- Я использую команду стресса для загрузки ядер ЦП (stress --cpu 6) и выполнить долгосрочную задачу. Я нашел несколько наблюдений, в которых irqHandler потребовалось 7-10 мс для выполнения верхней половины (irqHandler).
- при загрузке системы несколько миллисекунд или ожидается микросекундная задержка, но может ли она действительно достигать 10 мс? Или в моей реализации произошли какие-либо ошибки?
В irqHandler мы просто используем ktime () для регистрации времени события и установки одного флага на основе нарастающего/спадающего фронта.
Кто-нибудь сталкивался с такой проблемой в реализации Linux/threaded_irq?
есть есть ли обходной путь для этой проблемы?
ваш ценный вклад будет высоко оценен.
В долгосрочной перспективе я сталкиваюсь с нарушениями в выполнении обработчика IRQ. 12 часов, 24 часа вот так. и через короткое время оно не приходит(получасовой тест).
Подробнее здесь: https://stackoverflow.com/questions/783 ... -execution
Мобильная версия