Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - evildrno

Seiten: [1]
1
Lowlevel-Coding / Re: Tastatur Eingabe
« am: 27. November 2011, 19:07 »
Oh man, man kann ja auch Interrupts maskieren, damit sollte es doch dann gehen, oder?
2
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 27. November 2011, 18:33 »
Hehe ja genau des is jetzt mein Problem, ich lege den Prozessor jetzt wenn der Interrupt von was anderem kommt (z.b PIT) gleich schlafen (mit hlt), also noch im Interrupt. Da is jetzt meine frage ob des so gut geht: Hier der mein Thread zum Thema Tastatur Abfragen (so wie scanf usw)
http://forum.lowlevel.eu/index.php?topic=2946.0
3
Lowlevel-Coding / Re: Tastatur Eingabe
« am: 27. November 2011, 18:25 »
So ich hab die ganze Geschichte doch mit Interrupts gemacht (der Code is hauptsächlich vom Tut. hier).
Jetzt wäre es ganz cool wenn sich jemand das Anschauen könnt, also dies ist mein Interrupt-Handler und "readKeys" is auf 1 wenn ich grad in der "getc" also Einlesemethode (bleibt solange auf 1 bis Enter dabei war oder ende vom Buffer ereicht wurde) bin.
void handle_interrupt(struct cpu_state* cpu)
{

    if (cpu->intr <= 0x1f) {
        print("Exception %d, Kernel angehalten!");
        moveCursor(0,0);

        // TODO Hier den CPU-Zustand ausgeben

        while(1) {
            // Prozessor anhalten
            asm volatile("cli; hlt");
        }
    } else if (cpu->intr >= 0x20 && cpu->intr <= 0x2f) {
        if(cpu->intr == 33){    // Tastatur
            mprintf(byteToChar(key_ins),80*13,0x07);  //Nur ne Ausgabe wieviel Tastenanschläge bzw. Tastatur Interrupts es gab
            moveCursor(0,0);

            unsigned char flag;
            unsigned char input;

            flag = inb(0x64) & (0x01); //Hier ggf noch überprüfen ob flag auch wirklich gesetzt bevors weiter geht
            input = inb(0x60);
            new_checkKeys(flag, input);  //schreibt mir in ne bitmaske welche tasten gerade gedrückt sind
            if((readKeys > 0) && (input < 128))
                new_getLine_int(flag, input);  //ruft die methode auf welche nacheinander die Zeichen in den Buffer lädt
            key_ins++;

        } else
        if(cpu->intr == 32){    //timer
            mprintf(byteToChar(tim),80*12,0x07);  //Ausgabe von Timer Interrupt Anzahl -> Zeit seit dem das programm leuft
            moveCursor(0,0);
            tim++;                                              //und Variable hochzählen
        }

        if(readKeys > 0 ){     //--> Hier is die Frage ob man des so machen kann, also wenn readKeys auf 1 is, den Prozessor noch im Interrupt schlafen legen
            outb(0x20, 0x20);//     und warten bis neuer Interrupt kommt
            outb(0xa0, 0x20);

            asm volatile ("sti;hlt");
        }

        if (cpu->intr >= 0x28) {
            // EOI an Slave-PIC
            outb(0xa0, 0x20);
        }
        // EOI an Master-PIC
        outb(0x20, 0x20);

    } else {
        print("Unbekannter Interrupt");
        while(1) {
            // Prozessor anhalten
            asm volatile("cli; hlt");
        }
    }
}

So Ist das ok, Oder wird da der Stack zugemüllt da bei einem Interrupt (z.b. durch PIT) der alte Interrupt noch nicht beendet wird, also Register wieder herstellen usw. Und dann wird ja wieder auf den neuen Interrupt gewartet, der ggf. wieder nicht zu ende kommt usw.
Also seinen Sinn des polling zu vermeiden tuts schon, also cpu auslastung ist so minimal.

Wenn das so schwachsinn is, wie kann ich des anderes machen.
4
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 27. November 2011, 13:54 »
OH MEIN GOTT, DANKE DANKE!!!
Ja des mit dem EOI wars dann auch ;-) hab des wohl beim Handler neu schreiben als nicht wichtig angesehen und rausgelöscht!. Ok jetzt tut alles und danke für die Geduld mit mir ^^.
Naja jetzt mach ich mich mal zuerst drann den "Tastatur Treiber" ohne Polling zu machen.
Wie ist des denn wenn ich den Processor mit hlt schlafen lege, und ich dann auf die Tastaur Eindresche macht er wieder weiter, so dass ich ihn zwsichen den einzelnen Tastatur Eingaben schlafen legen kann, oder?
5
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 27. November 2011, 13:37 »
Muuhhaa, ok ich fang jetzt gleich des heulen an.
Also du meinst es müsste auf 32 der pic und auf 33 der Tastatur Dinger liegen, aber warum  wird dann handle_interrupt(...) nich aufgerufen wenn ich auf die tastatur ein hacke bzw warum wird handle_interrupt nur einmal vom pit aktiviert??? Also wntweder bin ich einfach zu blöd und muss mal 2-3 Tage abstand davon nehmen um wieder klar zu kommen, oder es is der wurm drinn...
6
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 27. November 2011, 11:53 »
Gut das weiß ich jetzt natürlich auch nicht ob ich da alles richtig gemacht hab. Also ich hab dieses hier http://git.tyndur.org/?p=tutorial.git;a=commit;h=28b2b4cbda58827f241c9ef030ae2997a9a4f3e8
genommen und in mein Projekt eingearbeitet, und dann nur noch in der init() von der main.c   
init_gdt();
init_intr();
Aufgerufen. Da dann, wenn ich später zb in der init() mit asm(int $xyz) nen interrupt ausgerufen hab, der auch so angekommen ist in dem interrupt handler von der intr.c, hab ich eig. gedacht da wäre alles richtig, aber wie gesagt Hardware Interrupts kommen nicht an, aber wenn ich z.b durch null teile kommt wiederum ne exeption an... Kein Plan.
Ich hab also sozusagen die kritischen Sachen direkt von intr.h und intr.c und der stub.S übernommen nur den Handler n bissle umgeschrieben, um z.b die Interrupt Nummer auszugeben usw. da ich kein kprintf hab. Wenn man da natürlich noch irgendwelche Einträge zusätzlich machen muss fehlen die bei mir. Aber ich hab auch kein Plan welche ich brauch für den PIT und Keyboard
7
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 27. November 2011, 11:17 »
Hä? Warum ist jetzt int 32 vom PIT ausgelöst? und warum Löst er dann nur beim Start 1 mal aus? Eingestellt ist er ja auf Intervall, des hab ich schon getestet (also das er nur 1. auslöst). Und warum steht dann hier: http://www.lowlevel.eu/wiki/IRQ#IRQ_Tabelle
Dass 0 vom PIT ausgelößt wird bzw 0x08. Also vom 32 hab ich noch nirgends was gelesen. Also der Interrupt S''''' macht mich grad echt fertig XD
8
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 26. November 2011, 23:18 »
Soo, hab nun mal versucht die Inerrupts zu behandeln. Aber nur mit mäßigem Erfolg:
Hab den Code vom Tut. hier also http://git.tyndur.org/?p=tutorial.git;a=commit;h=28b2b4cbda58827f241c9ef030ae2997a9a4f3e8
handle_interrupt hab ich so umgeschrieben das es mir immer die interrupt-Nummer noch ausgibt und nicht auf int 32 reagiert, der irgendwie mit qemu immer ausgelöst wurde. Soweit so gut und wenn ich im prog dann irgendwo zb. asm("int $3") benutzt hab hat das auch super getan, aber auf Tastatureingaben oder den PIT den ich mit void pit_init(int freq)
{
   freq = 1193182 / freq;
   outb(0x43, 0x34);
   outb(0x40,freq & 0xFF);
   outb(0x40,freq >> 8);
}
eingestellt hab, hat mein handler einfach mal garnichts gemacht...
Muss man da noch was spezielles machen das der auch auf Tastatur und PIT (ich denk doch mal auch Hardware Interupts im allg) reagiert???
9
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 26. November 2011, 20:00 »
OK Danke, dann muss ich wohl doch mit IRQs und dem PIC und so arbeiten, dachte ich komme darum herum ein Interrupt Handler zu machen, weil das hab ich beim Tutorial überblättern noch nicht so richtig verstanden und sieht n bisschen komplizierter aus... naja dann hab ich des WE was zu tun^^
Muss ich um dem PIC programmieren zu können auch im RM sein oder geht das dann auch im PM? Wie gesagt hab das alles noch nicht so richtig ferstanden. Aber wenn ich dann schon mit dem PIC arbeite kann ich auch meine Tastatur Abfrage ohne polling machen^^(Siehe mein anderen Thread, wens interresiert XD)
10
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 26. November 2011, 19:39 »
Ah ok, d.h. auch mit int 1ah hätt ich nur Sekunden gehabt? Gut dann is des auch geklärt. Ja es geht eig. darum n kleines spiel zu machen und dann eben so z.b. die Spielzyklen Zeit zu steuern, also bei 20fps muss ich halt schaun ob seit dem letzten durchlauf  50 ms vergangen sind, wenn nicht z.B. in ne Methode gehen die nicht viel tut, dann wieder zurück und schaun ob jetzt ca. 50 ms rum sind usw.
Gut da könnte man ja ggf. beim starten des spiels schauen wieviel spielzyklen ich in einer sek. in etwa hin bekomm, und das dann so irgendwie steuern aber des is ja alles doof. Wie funzt des dann z.b. bei java mit getcurrenttimemillis, oder einer anderen Programiersprache(ja ich weis das Java ne VM is, aber auch die muss ja irgendwie die Millisekunden vom echten System bekommen...).
Aber mal OT: kann ich mit lidt wieder interrupts im PM benutzen oder wie hab ich das zu verstehen?
11
Lowlevel-Coding / Re: Uhrzeit abrufen
« am: 26. November 2011, 19:15 »
So ja also bin im 32bit protected mode, kompiliere ja mit 32bit  (gcc -m32 ...)^^ . So ok dann wäre das ja geklärt, dann hab ichs noch mit dem CMOS getestet und auch die Sekunden in BCD bekommen, bräuchte aber eher so Millisekunden -.-
Aber Danke euch, gerade das der Assemblerbefehl direkt hintereinander ausgeführt werden sollte macht Sinn, aber hab ich einfach nicht dran gedacht, nützt mir leider gerade noch nicht so viel  :?
12
Lowlevel-Coding / Uhrzeit abrufen
« am: 26. November 2011, 18:17 »
Hi, also ich würde gern die aktuelle Uhrzeit abrufen können. Im i-net hab ich gelesen das es mit diesem Assembler befehlen geht:
xor ah, ah  //ah auf 0 setzen
int 1ah      //interrupt aufrufen
Dann sollte in ex und dx n counter drinn sein (millisec oder so denk ich)...
So dann dachte ich, ich schreib sowas:
static inline unsigned long getTime(void){
    unsigned long h,l;
    asm volatile ("xor %ah, %ah");
    asm volatile ("int $0x1a": "=c" (h), "=d" (l));
    return ((h<<16) | (l & 0x00ff));
}

Also ob das mit dem =c und =d als Ausgabe tut weiß ich net, bitte klärt mich auf.
Aber wenn ich des so mit make mache (benutze die makefile usw. von hier ausm tut) kommt kein Fehler aber wenn ich den "kernel" in qemu starte stürzt alles ab und qemu startet den "Rechner" neu. Hat da einer einen Plan?

Danke schön

edit:
Wie kann man bei dem code quote hier des highlighting anschalten?
Und kann man die makefile so ändern dass es erkennt ob sich auch Header geändert haben im Programm?
13
Lowlevel-Coding / Re: Tastatur Eingabe
« am: 24. November 2011, 22:41 »
Ok, habs dann hin bekommen. Mit ein wenig Assembler wars dann auch kein prob. Aber bis ich den Inline-Assembler verstanden hab  :? Naja und gerade für ne Methode wie scanf oder getchar is ja polling durchaus ok ^^.
 Wegen dem Code vorprogramieren: Ich mein des is halt geschickt ums mal prinzipel besser zu verstehen anhand eines bsp. Ich mein umprogrammieren hätt ichs ja so oder so müssen. Wenn ichs fertig hab und n getchar dann richtig tut poste ichs hier ggf. für die dies auch wissen wollen und net gleich hin bekommen.
14
Lowlevel-Coding / Tastatur Eingabe
« am: 24. November 2011, 19:10 »
Hallo an Alle, hab jetzt gerade meinen ersten lowlevel "Kernel" programmiert, wenn man des so nennen kann XD. Kann halt nen String ausgeben, bin also noch bei HelloWorld...

Naja schön wäre es jetzt natürlich auch ne Eingabe machen zu können, dann kann man ja schon sein erstes "Jump n run" machen, oder nen Taschenrechner...

Hab jetzt aber keinen Plan wie (in C so weit wie es geht, bzw. halt Inline-Assembler). Hab nach der suche mit der SuFu gelesen, dass man dazu den PIC programieren muss und nen IDP Eintrag machen muss. Da steig ich aber noch net so richtig durch. Gibts da evtl. gerade dafür n tutorial, bzw. kann mir da einer das "vorprogrammieren" und erklären?

Ich weiß noch, dass ich vor 2 Jahren mal sowas auf nem RISC glaub war n MIPS in Assembler gemacht hab. Also per Polling geschaut ob der Tastatur-Controller was hat, und wenn ja in den Speicher geschrieben und dann halt noch addiert. Da brauchte ich aber keine interupt Tabelle usw. geht das für den x86 und C (mit Inline-Assembler) nicht ähnlich einfach, gut polling ist nicht schön, aber fürs erste langts... Wenn Ja (also es geht) kann mir da jemand ne Methode machen, mit der ich z.B einfach die angelegte taste in n Int bekomm, oder so, den rest bekomm ich dann hin.

So falls mir da jemand Helfen könnt (was vorprogrammiren wäre am besten, aber auch Denkanstöße fänd ich klasse) wäre das super. Danke schön
Seiten: [1]

Einloggen