Обработка аппаратных прерываний внешнего таймера
Добавлено: 28 янв 2013, 19:10
Здравствуйте уважаемые форумчане.
Есть железка Helios (HLV800-256AV) шина PC/104 (ISA) на которой имеется аппаратный таймер. Пишу драйвер, в котором мне необходимо обработать прерывания по таймеру с максимально возможной скоростью.
Версия ядра 2.6.23. Собственно для таймера можно задать частоту с которой он будет генерировать прерывания по линии IRQ=5 до 100 КГц. Ранее мне не приходилось писать драйвера под линукс, посему извините если что не так пишу.
Состояние обработчика прерываний смотрю через cat /proc/interrupts. На линии 5 кроме моего обработчика никто не висит. Собственно модуль ядра по обработке данного прерывания работает на частотах до 20КГц (те обработчик вызывается через каждые 50 микросекунд). Обработчик собственно ничего не делает кроме увеличения счетчика и сброса прерывания на плате. При увеличении частоты таймера скажем до 40КГц (25 микросекунд), обработчик прерываний выполняется какое-то время и после чего перестает вызываться (cat /proc/interrupts счетчик событий останавливается), при этом другие функции модуля ядра работают (IOCTL READ итп). После этого обработчик прерываний как-будто бы вообще перестает отрабатывать. Посему возникают вопросы:
1. При каких условиях ядро(а может что то еще) может прервать обработку прерываний в модуле ядра? При этом никаких ошибок не выдается.
2. Как оценить максимально возможную частоту обработки прерываний?
3. Можно ли гарантировать что все поступающие прерывания от аппаратуры(внешнего таймера) будут обработаны? Может есть какие программные способы которые позволят избежать подобного "зависания" (пусть лучше будут необработанные прерывания чем полная остановка их обслуживания)?
4. Что произойдет если нагрузка на обработчик будет возрастать и по времени будет приближаться к частоте вызова обработчика?
Буду рад любым ответам по данным вопросам.
С уважением Владимир.
Есть железка Helios (HLV800-256AV) шина PC/104 (ISA) на которой имеется аппаратный таймер. Пишу драйвер, в котором мне необходимо обработать прерывания по таймеру с максимально возможной скоростью.
Версия ядра 2.6.23. Собственно для таймера можно задать частоту с которой он будет генерировать прерывания по линии IRQ=5 до 100 КГц. Ранее мне не приходилось писать драйвера под линукс, посему извините если что не так пишу.
Код: Выделить всё
//Вот обработчик
static irqreturn_t my_interrupt( int irq, void *dev_id )
{
irq_counter++; // Счетчик событий таймера
outb(0x04,BAHelios); // Сброс состояния прерывания таймера для платы Helios
return IRQ_HANDLED;
}
...
//При инициализации модуля назначаю обработчик
result = request_irq(irq, &my_interrupt, IRQF_TIMER, "my_interrupt", &my_dev_id);
1. При каких условиях ядро(а может что то еще) может прервать обработку прерываний в модуле ядра? При этом никаких ошибок не выдается.
2. Как оценить максимально возможную частоту обработки прерываний?
3. Можно ли гарантировать что все поступающие прерывания от аппаратуры(внешнего таймера) будут обработаны? Может есть какие программные способы которые позволят избежать подобного "зависания" (пусть лучше будут необработанные прерывания чем полная остановка их обслуживания)?
4. Что произойдет если нагрузка на обработчик будет возрастать и по времени будет приближаться к частоте вызова обработчика?
Буду рад любым ответам по данным вопросам.
С уважением Владимир.