Добрый день!
После того, как я скачал книгу Linux Device Drivers с сайта http://www.oreilly.com/catalog/linuxdrive2/chapter/book, многие вещи стали более понятными. Я сделал распайку для LPT-разъема, соединил на плате 9 и 10 линии, начал писать программу. Но обработать аппаратное прерывыание пока так и не удалось, хотя работа с регистрами проходит на ура. Делаю, вроде бы, всё, как описано в главах 8 и 9. Но, пока, к сожалению, ничего не получается.
Вот текст моей программы:
**********************************
#include <stdio.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <linux/sched.h>
#define BASE378 0x378
void irq7_interrupt()
{
outb(0xFF,BASE378);
outb(0x20,0x20);
};
int main ()
{
unsigned int irq7 = 7;
unsigned int i = 0;
void enable_irq(unsigned int irq7);
if (ioperm(0x20,2,1)) {perror("ioperm"); exit(1);};
if (ioperm(BASE378,3,1)) {perror("ioperm"); exit(2);};
outb((inb(BASE378+1) && 0x10),BASE378+1);
/*
0x10 - этот бит разрешает прерывания от параллельного порта
*/
request_irq(irq7, irq7_interrupt, SA_INTERRUPT, irq7_interrupt);
if (ioperm(0x20,2,0)) {perror("ioperm"); exit(3);};
if (ioperm(BASE378,3,0)) {perror("ioperm"); exit(4);};
void disable_irq(unsigned int irq7);
return 0;
}
**********************************
Файл сохранил как ex01.c, компилирую его - # gcc ex01.c -o ex01,
а в ответ получаю кучу предупреждений и ошибок (похоже, что не связанных с тем, что я написал) - в общем всё, кроме испольняемого файла.
Вот вовод "ответов" компилятора:
**********************************
[root@YuOffice irq]# gcc ex01.c -o ex01
In file included from /usr/include/linux/sched.h:13,
from ex01.c:5:
/usr/include/linux/times.h:5: parse error before "clock_t"
/usr/include/linux/times.h:7: parse error before "tms_cutime"
/usr/include/linux/times.h:8: parse error before "tms_cstime"
In file included from /usr/include/linux/sched.h:14,
from ex01.c:5:
/usr/include/linux/timex.h:173: field `time' has incomplete type
In file included from /usr/include/linux/bitops.h:69,
from /usr/include/asm/system.h:7,
from /usr/include/linux/sched.h:16,
from ex01.c:5:
/usr/include/asm/bitops.h:327:2: warning: #warning This includefile is not available on all architectures.
/usr/include/asm/bitops.h:328:2: warning: #warning Using kernel headers in userspace: atomicity not guaranteed
In file included from /usr/include/linux/signal.h:4,
from /usr/include/linux/sched.h:25,
from ex01.c:5:
/usr/include/asm/signal.h:107: parse error before "sigset_t"
/usr/include/asm/signal.h:110: parse error before '}' token
In file included from /usr/include/linux/signal.h:5,
from /usr/include/linux/sched.h:25,
from ex01.c:5:
/usr/include/asm/siginfo.h:26: parse error before "pid_t"
/usr/include/asm/siginfo.h:38: parse error before "pid_t"
/usr/include/asm/siginfo.h:41: parse error before '}' token
/usr/include/asm/siginfo.h:45: parse error before "pid_t"
/usr/include/asm/siginfo.h:48: parse error before "_utime"
/usr/include/asm/siginfo.h:49: parse error before "_stime"
/usr/include/asm/siginfo.h:62: parse error before '}' token
/usr/include/asm/siginfo.h:63: parse error before '}' token
In file included from /usr/include/linux/sched.h:78,
from ex01.c:5:
/usr/include/linux/time.h:10: parse error before "time_t"
/usr/include/linux/time.h:12: parse error before '}' token
/usr/include/linux/time.h:18: parse error before "time_t"
/usr/include/linux/time.h:44: field `it_interval' has incomplete type
/usr/include/linux/time.h:45: field `it_value' has incomplete type
/usr/include/linux/time.h:49: field `it_interval' has incomplete type
/usr/include/linux/time.h:50: field `it_value' has incomplete type
In file included from /usr/include/linux/sched.h:80,
from ex01.c:5:
/usr/include/linux/resource.h:22: field `ru_utime' has incomplete type
/usr/include/linux/resource.h:23: field `ru_stime' has incomplete type
In file included from /usr/include/linux/sched.h:81,
from ex01.c:5:
/usr/include/linux/timer.h:32: field `vec' has incomplete type
/usr/include/linux/timer.h:37: field `vec' has incomplete type
/usr/include/linux/timer.h:45: parse error before "spinlock_t"
/usr/include/linux/timer.h:53: parse error before '}' token
/usr/include/linux/timer.h:63: field `list' has incomplete type
/usr/include/linux/timer.h:67: parse error before "tvec_base_t"
/usr/include/linux/timer.h:101: parse error before "tvec_bases"
/usr/include/linux/timer.h: In function `init_timer':
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:106: dereferencing pointer to incomplete type
/usr/include/linux/timer.h: In function `timer_pending':
/usr/include/linux/timer.h:121: dereferencing pointer to incomplete type
[root@YuOffice irq]#
**********************************
Соответственно, возникает несколько вопросов. Первый, естественно - что не так? Второй - может быть, все-таки, кто-то уже общался с аппаратными прерываниями, имеет опыт борьбы с ними?
Пожалуйста, если вы можете чем-нибудь помочь в моей глупой ситуации - откликнитесь!
Заранее благодарен!
-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com