Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

Tutorials.at
Verfügbare Informationen zu "Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Dirty Oerty - Xin - DrPhil_Guth
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: C / C++
  • Antworten: 8
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?
  • Letzte Antwort: vor 15 Jahren, 11 Monaten, 15 Tagen, 16 Stunden, 45 Minuten
  • Alle Beiträge und Antworten zu "Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?"

    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    Dirty Oerty - 26.04.2008, 12:31

    Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?
    Tag!

    Um euch gleich mal vorzuwarnen: Die folgende Frage bezieht sich auf einen Teil des Codes, den ich in meinem (bis jetzt noch recht fehleranfälligen) grundlegenden Betriebssystem verwende.


    Der Code dient dazu, auf Druck der Tasten Num-,Caps- bzw Scrolllock die jeweilige LED auf dem Keyboard an, bzw aus zuschalten.

    Code: /* Sets the keyboard lights
     * status = 0 => all off
     * status = 1 => only scroll-lock
     * status = 2 => only num-lock
     * status = 3 => num and scroll
     * status = 4 => only caps-lock
     * status = 5 => caps and scroll
     * status = 6 => caps and num
     * status = 7 => all on*/
    void keyboard_lights_set(short status)
    {
       if (status > 7) status=7;
       while(1){
          if ((inportb(0x64) & 2) == 0) break;
       }
       outportb(0x60,0xED);
       outportb(0x60,status & 7);
    }

    Dieser Code ändert den Status der LEDs.
    Das funktioniert bei einem direkten Aufruf auch ohne Probleme und sofort.

    Nun wird dieser Code jedoch bei einem Druck auf einer der drei Locktasten nicht direkt aufgerufen, denn das funktioniert irgendwie gar nicht.

    Bei Druck auf eine Locktaste wird der Status neu berechnet und danach eine globale Systemvariable auf einen bestimmten Wert gesetzt.
    Der "Leerlaufprozess" überprüft in einer Schleife ständig diese globale Variable und handelt, je nach Wert.
    Liegt der richtige Wert vor, dann ruft der Leerlaufprozess die obige Funktion auf, natürlich mit dem neuen Status.
    Folge: Der Status der LEDs wird verändert.

    Soweit zur Theroie.

    In der Praxis sieht das Ganze so aus:

    Erst nach mehrmaligen Drücken der Locktasten ändert sich überhaupt etwas an dem LED Status.
    Dann funktioniert aber alles ohne Probleme und ohne Zeitverzögerung.

    Es scheint so, als ob sich das Ganze immer erst "warmlaufen" müsste.

    Nun rätsle ich natürlich, woran das liegt und wie ich das weg bekomme.

    Meine Idee ist, dass das Problem in der while-Scheife der Funktion oben liegt. Diese Schleife prüft, ob das Keyboard bereit für eine Änderung ist.

    Vllcht ist es anfangs nicht bereit?
    Oder iwie so?

    *Fragend guck*

    Vllcht kann mir ja jemand helfen.

    MfG
    Daniel



    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    Xin - 26.04.2008, 13:32

    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich'
    Dirty Oerty hat folgendes geschrieben: Tag!

    Um euch gleich mal vorzuwarnen: Die folgende Frage bezieht sich auf einen Teil des Codes, den ich in meinem (bis jetzt noch recht fehleranfälligen) grundlegenden Betriebssystem verwende.
    Noch ein Geisteskranker... herzlich willkommen im Club.
    Ich hab's auch mal versucht und festgestellt, dass ich es nicht umsetzen kann, weil es die passende Programmiersprache nicht gibt... also habe ich angefangen den passenden Compiler zu schreiben. Zum Betriebsystem gab's 'ne Ideensammlung, die über 20 DinA4 Seiten ging. Der Compiler, den beiläufig dazu entsteht, füllt derzeit mehrere Aktenordner.
    In diesem Sinne, solltest Du Dir nicht mehr zuviel in diesem Leben vornehmen ;-)

    Das OS habe ich inzwischen abgehackt, zumal die ersten Ideen schon in aktuellen OS auftauchen oder zumindest sich abzeichnen, dass sie in den nächsten 10 Jahren auftauchen werden - also bevor ich sie implementieren kann.
    Mit dem Compiler bin ich dafür noch ganz gut dabei :-)

    Dirty Oerty hat folgendes geschrieben:
    Der Code dient dazu, auf Druck der Tasten Num-,Caps- bzw Scrolllock die jeweilige LED auf dem Keyboard an, bzw aus zuschalten.

    Das funktioniert bei einem direkten Aufruf auch ohne Probleme und sofort.

    Dann wird der Code wohl okay sein.

    Dirty Oerty hat folgendes geschrieben:
    Nun wird dieser Code jedoch bei einem Druck auf einer der drei Locktasten nicht direkt aufgerufen, denn das funktioniert irgendwie gar nicht.

    Dann wird der fehlerhaft sein, den Du nicht abgedruckt hast.

    Dirty Oerty hat folgendes geschrieben:
    Erst nach mehrmaligen Drücken der Locktasten ändert sich überhaupt etwas an dem LED Status.
    Dann funktioniert aber alles ohne Probleme und ohne Zeitverzögerung.

    Klingt nach einem Initialisierungsproblem. Wenn Du Dein Programm startest, sind alle Variablen in einem klar definierten Zustand?



    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    DrPhil_Guth - 26.04.2008, 18:17


    Hm, ich bin mir nicht sicher ist nur so ne idee:
    Vielleicht ist der Keyboardinput gepuffert? Vl. so ähnlich wie die stdio funktionen? Das würde es nämlich erklären, denn dann werden die tastatureingaben nur an den prozess geschickt wenn der puffer voll ist.



    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    Dirty Oerty - 30.04.2008, 23:34


    So, nun hab ich mal Zeit hier drauf zu antworten. Sorry für die lange "Wartezeit".

    Also...alle Variablen klar definiert.
    Keine Ahnung.
    Muss ich ehrlich sagen.

    Habe jetzt aber folgende Vermutung:

    Die Funktion, die die LED's umschaltet, prüft bevor sie Anweisungen an den Keyboardkontroller schickt, ob dieser gerade beschäftigt ist (ob das sog. Busy-Bit gesetzt ist). Dieses Bit wird erst wieder null gesetzt, wenn der Keyboardinterrupt vorbei ist.

    Was während der Funktion evtl noch nicht der Fall ist...



    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    Xin - 01.05.2008, 13:15


    Dirty Oerty hat folgendes geschrieben: So, nun hab ich mal Zeit hier drauf zu antworten. Sorry für die lange "Wartezeit".

    Also...alle Variablen klar definiert.
    Keine Ahnung.
    Muss ich ehrlich sagen.
    Tjo... ohne Sourcecode und ohne das notwendige Background-Wissen, kann ich Dir da auch nicht helfen. Wenn Du sagst, alles ist toll, aber es funktioniert nicht, dann ist entweder Dein Rechner kaputt oder Du irrst Dich, was die Korrektheit Deines Programms angeht.

    Dirty Oerty hat folgendes geschrieben: Habe jetzt aber folgende Vermutung:

    Die Funktion, die die LED's umschaltet, prüft bevor sie Anweisungen an den Keyboardkontroller schickt, ob dieser gerade beschäftigt ist (ob das sog. Busy-Bit gesetzt ist). Dieses Bit wird erst wieder null gesetzt, wenn der Keyboardinterrupt vorbei ist.

    Was während der Funktion evtl noch nicht der Fall ist...
    Möglich... der Interrupt dauert wie lange? Wie hoch ist die Chance, dass Du grade bei Programmstart viele Interrupts hast und danach keine mehr?



    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    Dirty Oerty - 01.05.2008, 22:02


    Code: void keyboard_handler(struct regs *r)
    {
       unsigned char scancode;
       scancode = inportb(0x60);
       
       if (scancode & 0x80){
          //shift,alt,etc
       }else{
          switch (scancode)
          {
             case 58:
                puts("CapsLock!\n");
                switch_capslock();
                set_global_sys_message(500);
                return;
             case 69:
                puts("NumLock!\n");
                switch_numlock();
                set_global_sys_message(500);
                return;
             case 70:
                puts("ScrollLock!\n");
                switch_scrolllock();
                set_global_sys_message(500);
                return;
             case 88:
                set_global_sys_message(999);
                return;
             default:
                break;
          }
          
          putch(keyb_us_layout[scancode]);
       }
    }


    SO sieht der Keyboardhandler aus.
    Der wird jedesmal aufgerufen, wenn eine Taste gedrückt wurde.


    Code: for (;;){
          if (global_sys_message!=0){
             switch (global_sys_message){
                case 500:
                   update_keyboard_lights();
                   set_global_sys_message(0);
                   break;
                case 999:
                   puts("\n\n");
                   sys_timer_wait(200);
                   sys_reboot();
                   break;
                default: break;
             }
          }
       };

    Und diese Schleife wird ansonsten durchgegangen.

    Brauchst du mehr von dem Code?
    Oder ist ein Codeteil nicht verständlich? (Fehlen ja Kommentare)


    Wie lange der Interrupt dauert kann ich dir nicht sagen.
    Ob zu Beginn viele Interrupts geliefert werden?

    Naja....ein Interrupt (dieser Sorte) wird ja nur geliefert, wenn ich eine Taste auf dem Keyboard drücke.
    Also eigentlich nein.

    Andere Interrupts werden (meines Wissens nach) auch nicht produziert (mal abgesehen vom Timerinterrupt, der hat eine Frequenz von 100 HZ).



    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    Xin - 03.05.2008, 15:11


    Dirty Oerty hat folgendes geschrieben: Brauchst du mehr von dem Code?
    Oder ist ein Codeteil nicht verständlich? (Fehlen ja Kommentare)
    Klare Ansage: meine Erfahrung direkt auf das System zuzugreifen ist sehr gering. Ich müsste mich da einlesen, bzw. einen Code haben, mit dem ich spielen könnte. Die Abschnitte, die Du gepostet hast, erscheinen mir soweit nachvollziehbar.

    Dirty Oerty hat folgendes geschrieben: Wie lange der Interrupt dauert kann ich dir nicht sagen.
    Ob zu Beginn viele Interrupts geliefert werden?

    Naja....ein Interrupt (dieser Sorte) wird ja nur geliefert, wenn ich eine Taste auf dem Keyboard drücke.
    Also eigentlich nein.

    Andere Interrupts werden (meines Wissens nach) auch nicht produziert (mal abgesehen vom Timerinterrupt, der hat eine Frequenz von 100 HZ).
    Was mich etwas wundert ist, weshalb Du eine Endlosschleife benötigst. Ich habe damals (lange her) einen Treiber für eine PCI-Karte geschrieben und legte die Hauptfunktion sich schlafen und die Interrupts wurden von einer anderen Funktion bedient, die dann durch den Interrupt angesteuert wurde.

    In dem Bereich kann ich nur was sagen, wenn ich zuerst Deinen Code nachvollziehen kann, sorry.



    Re: Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?

    Dirty Oerty - 03.05.2008, 15:25


    Ja, so war das urspürnglich auch geplant:

    Ein Interrupt tritt auf, die entsprechende Funktion wird aufgerufen und abgearbeitet.
    In der Funktion wird dann (je nach dem ob's nötig ist) der LED-Status geändert und ans Keyboard gesendet.

    Soweit der Plan.

    Das ging nur leider nicht.

    Da tat sich dann gar nichts.
    Neue Interrupts konnte ich aber schon "erzeugen" (d.h. er hat weiter gemacht, nur die LEDs nicht umgeschalten)

    Deswegen hab ich das in die Hauptfunktion ausgelagert, und praktisch ein sehr simples Messagesystem eingebaut.

    Die Interruptfunktion setzt nur eine Variable, und in dieser Endlosschleifen wird dann erst die Änderung vorgenommen.

    MfG
    Daniel



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Tutorials.at

    2 Fragen - gepostet von d.d.d. am Samstag 24.03.2007
    Feldinhalt löschen - gepostet von dani93 am Montag 03.03.2008
    atoi (Fehler: cast ??) - gepostet von exbs am Mittwoch 20.12.2006
    Blender-Problem - gepostet von toby-man am Samstag 06.10.2007
    --- IDE --- (unbedingt lesen) - gepostet von X am Sonntag 10.09.2006
    Datei einlesen - gepostet von Blümchen am Mittwoch 07.02.2007
    Kostenloser Installmaker - gepostet von mitti am Donnerstag 17.05.2007
    Bitte helft mir bei Programm - gepostet von Homi555 am Donnerstag 07.02.2008



    Ähnliche Beiträge wie "Starke Zeitverzögerung, woran liegt's und wie umgeh ich's ?"

    Werwolf [-Saw-] Silbermond lvl 29 - Blutelfe (Montag 27.11.2006)
    Lvl 14 - thortex - 238 Gold - grafd2006 (Donnerstag 25.01.2007)
    Bewerbung Elementalist Lvl 70 - Eneayo (Sonntag 21.01.2007)
    Lvl 7: Rofl_lol 164Gold - Kadesh (Freitag 29.12.2006)
    Tauriflausch - Shanoo (Mittwoch 04.02.2009)
    Lvl 11 - Scare - Gold 107 - Phaseout (Montag 04.12.2006)
    ParaInversa lvl 49 - LouisDerVampyr (Mittwoch 21.02.2007)
    sternchen 1 lvl-up Gallerie - sternchen (Samstag 09.12.2006)
    Quick Aktuell LVL/5 - QuickHein (Mittwoch 28.03.2007)
    Arconyx1/lvl 20/ nur 83 Gold - Kronos (Donnerstag 04.05.2006)