Autor Thema: Probleme durch Multitasking  (Gelesen 3241 mal)

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« am: 08. October 2012, 20:46 »
Hallo,
ich habe bei meinem Kernel jetzt Multitasking hinzugefügt. Es funktioniert auch ganz gut, doch es gibt jetzt Probleme beim einlesen von Tastatureingaben.
Ich habe die Funktionen getchar() und getn() für die Eingabe von  Zeichen und Zahlen. Mit der Back-Space Taste können Zeichen und Ziffern wieder gelöscht werden, doch jetzt funktioniert es nicht mehr. Ich hab das Multitasking zum Test einmal wieder heraus genommen und es funktionierte wieder.
Hier einmal der Code meines Tastaturtreibers:
#include "IO_Ports.h"
#include "stdint.h"
#include "string.h"
#include "stdarg.h"

#ifndef KEYBOARD_H
#define KEYBOARD_H

int eingabe_j_n = 0;

int eingabe_g_k = 0;

#define MAX_SCANCODE 0x3a

char TASTEN_K[MAX_SCANCODE] = {27,   '1',  '2',   '3', '4',  '5',  '6',  '7',  '8',  '9',  '0', 'ß', '´', 8, '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 'ü', '+' , '\n' , 0 , 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'ö', 'ä', '<', 0, '#', 'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, ' ', 0};

char TASTEN_G[MAX_SCANCODE] = {27,   '!',  '"',   '§', '$',  '%',  '&',  '/',  '(',  ')',  '=', '?', '`', 8, '\t', 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 'Ü', '*' , '\n' , 0 , 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Ö', 'Ä', '>', 0, '\'', 'Y', 'X', 'C', 'V', 'B', 'N', 'M', ';', ':', '_', 0, 0, 0, ' ', 0};

void cmd_keyboard(uint8_t cmd)
{
int i = 1;
while (i == 1)
{
if(inb(0x64) & 0x2)
{
}
else
{
i = 0;
}
}
    outb(0x60, cmd);
}

uint8_t read_scancode()
{
while (!(inb(0x64) & 0x1))
{
}

uint8_t scancode = inb(0x60);

return scancode;

while(inb(0x64) &0x1)
{
inb(0x60);
}

}

char translate_scancode(uint8_t scancode)
{
if(scancode == 0x2a || scancode == 0x36 || scancode == 0x3a)
{
if(eingabe_g_k == 1)
{
eingabe_g_k = 0;
cmd_keyboard(0xed);
outb(0x60,0x00);
}
else
{
eingabe_g_k = 1;
cmd_keyboard(0xed);
outb(0x60,0x02);
}
return 0;
}
if (scancode > MAX_SCANCODE)
{
return 0;
}

uint8_t i = 0x01;
while(i <= MAX_SCANCODE)
{
if (scancode == i)
{
if(eingabe_g_k == 0)
{
return TASTEN_K[i-1];
}
else if(eingabe_g_k == 1)
{
return TASTEN_G[i-1];
}
}
i++;
}

}

int getchar()
{
A:;
char chr;

while(eingabe_j_n != 1)
{
}

uint8_t scancode = read_scancode();

chr = translate_scancode(scancode);
if(chr == 8)
{
del_last_char();
}

else if (chr != 0)
{
put_char(chr);
}

else if(chr == 0)
{
eingabe_j_n = 0;

goto A;
}

eingabe_j_n = 0;

return chr;
}

int getch()
{
A:;
char chr;

while(eingabe_j_n != 1)
{
}

uint8_t scancode = read_scancode();

chr = translate_scancode(scancode);
if(chr == 0)
{
eingabe_j_n = 0;

goto A;
}

eingabe_j_n = 0;

return chr;
}


int getn()
{
int zahl = 0;
char chr = 0;
while(chr != '\n')
{
chr = getch();
if(chr == 8)
{
zahl = zahl / 10;
del_last_char();
}
else if(chr > 57 || chr < 48)
{

}
else
{
put_char(chr);
int ziffer = chr - 48;
zahl = zahl * 10 + ziffer;
}
}

return zahl;
}

void init_keyboard()
{
set_color(0x0e);kprintf("\tStarte Tastatur...");

while(inb(0x64) &0x1)
{
kprintf(".");
inb(0x60);
}

cmd_keyboard(0xF4);

read_scancode();

set_color(0x06);kprintf("\tTastatur gestartet!\n");set_color(0x07);
}

void handle_keyboard()
{
eingabe_j_n = 1;
}

#endif

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 08. October 2012, 20:51 »
Es funktioniert auch ganz gut, doch es gibt jetzt Probleme beim einlesen von Tastatureingaben.
Ich habe die Funktionen getchar() und getn() für die Eingabe von  Zeichen und Zahlen. Mit der Back-Space Taste können Zeichen und Ziffern wieder gelöscht werden, doch jetzt funktioniert es nicht mehr.
Kannst du das genauer beschreiben? Was genau funktioniert nicht mehr?
Dieser Text wird unter jedem Beitrag angezeigt.

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 08. October 2012, 20:58 »
Wenn ich die Back-Space Taste drücke wird die Eingabe nicht mehr gelöscht. Ich habe um zu testen, ob alles funktioniert in einem Task ein sehr einfaches Rechenprogramm geschrieben. Wenn man dort eine Zahl eingibt und sie ändern möchte sollte man die Back-Space Taste drücken können, um die Zahl Ziffer für Ziffer wieder zu löschen. Ohne Multitasking funktionierte das auch noch, aber jetzt im Task nicht mehr.
Hier noch der Codes des sehr einfachen Rechenprogramms:
void task_a(void)
{
    while (1)
{
int zahl_1 = 0;
int zahl_2 = 0;
char rechenzeichen = 0;
int ergebnis = 0;
        kprintf("\nBitte Zahl_1 eingeben: ");
zahl_1 = getn();
getch();

kprintf("\nBitte Rechenzeichen eingeben: ");
rechenzeichen = getchar();
getch();

kprintf("\nBitte Zahl_2 eingeben: ");
zahl_2 = getn();
getch();

switch(rechenzeichen)
{
case '+':
ergebnis = zahl_1 + zahl_2;
break;

case '-':
ergebnis = zahl_1 - zahl_2;
break;

case '*':
ergebnis = zahl_1 * zahl_2;
break;

case '/':
ergebnis = zahl_1 / zahl_2;
break;

case '%':
ergebnis = zahl_1 % zahl_2;
break;

default:
kprintf("\n \t Ungueltiges Rechenzeichen!");
break;
}
kprintf("\n \t Ergebnis: %d", ergebnis);
    }
}

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. October 2012, 21:19 »
Tritt das Problem auch auf, wenn du Multitasking aktiviert hast, aber nur den einen Task mit dem Rechner startest? Wenn nein, dann stört vermutlich ein anderer Task, indem er zum Beispiel auch Methoden aus dem Tastaturtreiber aufruft. Dann musst du dir was einfallen lassen wie du sicherstellst, dass nur ein Task die Tastatur nutzt. Das heißt du bräuchtest das Konzept von Vordergrund- und Hintergrundprozess.
Dieser Text wird unter jedem Beitrag angezeigt.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 08. October 2012, 21:32 »
Oder ein Konzept von "Treiber" und "Anwendung".

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 08. October 2012, 22:00 »
Vielen Dank für die schnellen Antworten!
Es ist wirklich der andere Task, der die Tastatur stört.
Ich frage mich jedoch, warum dann alle anderen Tasten ohne Probleme funktionieren.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 08. October 2012, 22:13 »
Meine Vermutung wäre, dass es zwischen del_last_char und put_char irgendeinen Unterschied gibt, der das verursacht.
Dieser Text wird unter jedem Beitrag angezeigt.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 09. October 2012, 12:30 »
Die Lösung für dein Problem heisst: Debuggen.

Das Einfachste ist, du schickst zeilenweise Statuslogs and die serielle Konsole.

Kommt der Interrupt überhaupt aus dem Handler?
Sind die Tastatur-Buffer threadsafe? ie sind sie synchronisiert?

Gruß

 

Einloggen