я того що б переривання займали мало часу, як це можливо. Для процесорів нормальним зазвичай буде ISR виконуються в менш 40 мкс (дані з 1995). Очевидно, що 100-МГц Pentium і 4 МГц +8051 мають дуже різні часові масштаби, але концепція все та ж вийти швидко!
Список літератури
1.https: //ru.wikipedia/wiki/Прериваніе
2. # justify gt; Додаток
Драйвер клавіатури на базі архітектури Intel®
Рішення, яке я знайшов в тому, щоб написати щось для переривання клавіатури і відключити регулярне обробник переривання клавіатури в першу чергу. Так воно визначається як статичний символ у вихідних файлів ядра (зокрема драйвера// keyboard.c), немає ніякого способу, щоб відновити його. Перед insmod'ing цей код, виконайте на іншому терміналі sleep 120; reboot, якщо ви цінуєте вашу файлову систему.
Цей код пов'язує себе IRQ 1, який є IRQ клавіатури контрольованого відповідно до архітектури Intel. Потім, коли він отримує переривання клавіатури, він читає стан клавіатури (це мета inb (0x64)) і скан-коду, який повертає значення з клавіатури. Потім, як тільки ядро ??думає, що це можливо, він виконує got_char який дає код ключа, використовуваного (перші сім біт скан-коду) і була натиснута кнопка на клавіатурі його (якщо 8-й біт дорівнює нулю) абовідпуску (тоді це один).
Приклад 4.1. intrpt.c
/*
* Intrpt.c - обробник переривання.
*
* Copyright (C) 2001 Пітер Джей Зальцман
*/
/*
* Необхідні заголовні файли
*/
/*
* Стандартний модулів ядра
*/
# include lt; Linux/kernel.h gt;/* Ми робимо ядра працює */
# include lt; Linux/module.h gt;/* Зокрема, модуль */
# include lt; Linux/sched.h gt;
# include lt; Linux/workqueue.h gt;
# include lt; Linux/interrupt.h gt;/* Ми хочемо переривання */
# include lt; ASM/io.h gt;
# define MY_WORK_QUEUE_NAME «WQsched.c»
struct workqueue_struct * my_workqueue;
/*
* Це буде викликаний ядром, як тільки це безпечно
* Зробити все нормально, дозволений модулів ядра.
*/void got_char (void * scancode)
{(KERN_INFO «скан-код% X% С. п»,
(INT) * ((Char *) scancode) amp; 0x7F,
* ((Char *) scancode) amp; 0x80? «Відпущено»: «Натиснуто»);
}
/*
* Ця функція ослужівает клавіатуру у перериванні. Він читає актуальні
* Інформація від клавіатури, а потім ставить не критичні за часом
* Частина в черзі. Це буде працювати, коли ядро ??вважатиме це можливим.
*/_t irq_handler (INT IRQ, void * dev_id, struct pt_regs * regs)
{
/*
* Ці змінні є статичними, так як вони повинні бути
* Доступні (через покажчики) на нижній половині дня.
*/INT initialised=0; unsigned char scancode; struct work_struct task;
unsigned char status;
/*
* Читання стану клавіатури
* /=inb (0x64);=inb (0x60);
(initialised == 0) {_WORK ( amp; task got_char, amp; scancode);=1;
} else {_WORK ( amp; task got_char, amp; scancode);
}
_ work (my_workqueue, amp; task);
return IRQ_HANDLED;
}
/*
* Ініціалізація модуля - зареєструвати обробник переривань
*/init_module ()
{_ workqueue=create_workqueue (MY_WORK_QUEUE_NAME);
/*
* З обробник клавіатура залишиться буде співіснувати з іншим обробником,
* Як США, ми повинні відключити його (звільнити IRQ) перш, ніж ми робимо
* Що-небудь. Так як ми не знаємо, де він знаходиться, немає ніякого способу, щоб
* Можливості пров?? встановити його - тому комп'ютер доведеться перезавантажити