Autor Thema: IRQ-Problem  (Gelesen 3853 mal)

PowerProgrammer

  • Beiträge: 22
    • Profil anzeigen
Gespeichert
« am: 05. September 2007, 16:59 »
Hallo!
Ich bin ein kleiner Noob, der sich gerade an IRQs vergehen möchte.  Ich habe mich ein bisschen an dem Tutorial von Brandon F. (http://www.osdever.net/bkerndev/index.php) orientiert. ISR funktionieren super, aber bei den IRQs habe ich keine Ahnung. Eigentlich müsste der mir was anzeigen, da ja schließlich alles Mögliche was sendet, z.B. der PIT-Timer im PC. Aber es kommt nichts an. Wieso nicht? Muss man vorher irgendetwas aktivieren? Hatte jemand schon ein ähnliches Problem? Was ist zutun?

Vielen, vielen Dank!
Mfg, der verzweifelte Anfänger PowerProgrammer

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 05. September 2007, 20:17 »
Muss man vorher irgendetwas aktivieren?
Das Interrupt Flag (Abkürzung IF) in den EFlags (Prozessorregister) gibt an, ob externe Interrupt angenommen (IF = 1) oder abgelehnt (IF = 0) werden. Über die Mnemonics CLI (setzt IF = 0) und STI (setzt IF = 1) kann dieses Flag verändert werden.
Die IRQs können aber auch dadurch, dass sie im PIC (=Programmable Interrupt Controller) deaktiviert sind, nicht ausgelöst werden.

Bevor du aller allerdings IF über STI setzt, solltest du den PIC umprogrammieren. Normalerweise leitet der PIC eingehende IRQ nämlich auf irgendwelche Interrupts unter 32 um. Da die Interrupts unter 32 seit dem protected-mode für den Prozessor reserviert sind, sollte man dem PIC sagen, dass er seine IRQs gefälligst auf andere Interrupts verteilen soll.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

PowerProgrammer

  • Beiträge: 22
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. September 2007, 20:24 »
Joa, vielen danke. Interrupts sind mit STI enabled. Ich hatte schon versucht, die IRQs auf 32 - 47 zu mappen, klappte nicht, also hab ichs mal mit den Standardeinstellungen probiert (egal, wenn das mit den Exceptions kollidiert, zum Test), klappen tat es auch nicht.
Zitat
Die IRQs können aber auch dadurch, dass sie im PIC (=Programmable Interrupt Controller) deaktiviert sind, nicht ausgelöst werden.
Wie aktiviere ich die denn? Wie kann ich das prüfen?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 05. September 2007, 20:37 »
Ein Byte aus Port 0x21 lesen. Jedes Bit ist einem der 8 IRQs zugeordnet. Wenn dort ein Bit gesetzt ist, dann ist der interrupt deaktiviert.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

PowerProgrammer

  • Beiträge: 22
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. September 2007, 14:48 »
Dankeschön :-)

Ich habe 10111000 aus 0x21 ausgelesen.
=> IRQ 0, der Channel, den der Timer auch nutzt, ist deaktiviert

Weiß jemand, wie ich die Teile einfach alle wieder aktiviere? Kennt jemand vielleicht auch noch ein Tutorial, wo auf den PIC genauer eingegangen wird? Was ich gefunden habe, waren nur so kleine Tutorials, wo es höchstens um das Remappen der IRQs ging.
Vielen Dank, PowerProgrammer

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 06. September 2007, 15:32 »
Das von dir erwähnte Tutorial hat einen Abschnitt darüber ("8) Remapping the Programmable Interrupt Controllers (PICs) to new IDT entries"). Aber eigentlich sollte das was in den meisten Tutorials da "nur" als remappen beschrieben wird ausreichen. da alle ICWs (Initialization Command Words) and die PIC gesendet werden.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. September 2007, 16:01 »
Hier ein deutsch sprachiges Tut von TeeJay
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

PowerProgrammer

  • Beiträge: 22
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. September 2007, 16:39 »
Vielen vielen dank, aber das Problem lag woanders :-D :-D :-D :-D
Stundenlanges Fehlersuchen umsonst:
Ich habe am Ende nach der Ausgabe von ein bisschen Text folgendes gecodet:
while(1)
{
__asm__ ("cli");
__asm__ ("hlt")
}
Doppelt gemoppelt hält war besser, aber dadurch wurden auch die Interrupts blockiert :-D :-D :-D Wie peinlich, aber das passiert jedem Noob mal :wink:

Grr, gekommen bin ich auf den Fehler, als ich irgendwas anderes gemacht habe, da hatte ich mal wieder nen Gedankenblitz. Boah.

 

Einloggen