Тот же символ отображается в бесконечном цикле

Я следую этим учебникам:

http://wiki.osdev.org/Keyboard

http://wiki.osdev.org/User:Zesterer/Bare_Bones

Я пытаюсь добавить поддержку клавиатуры, но я оказался в ситуации, когда, если я нажимаю один символ, например 'A', программа продолжает показывать тысячи 'A'. > пока я не нажму другую клавишу, например '1' (также отображаются тысячи '1', пока я не нажму другую клавишу и т. д.). Я хочу размещать символы один за другим, я имею в виду, если 'A' нажимается после того, как он отобразит его один раз, и он все еще позволяет мне добавлять другие символы.

//Places single char onto the screen
void term_putc(char c);


//Provides the scancode from kb controller
char getScancode(){
char c=0;
do {
if(inb(0x60) != c)
{
c=inb(0x60);
if(c>0)
return c;
}
}while(1);}

//transfroms scancodes to chars
char getchar();

//shows the character on the screen
void kb_print(){ 
char chara = getchar(); // Pressed key value
term_putc(chara);
}

Теперь я вызываю основную функцию

void kernel_main(){
term_init();

while(1){
    kb_print();
}
}

Весь код:

https://pastebin.com/CMNvZN3P

Спасибо за ответы!


person Dykow    schedule 06.10.2017    source источник
comment
путаница в коде? вы забыли добавить код к вопросу   -  person Chris Turner    schedule 06.10.2017
comment
1.) добавьте код напрямую в вопрос, 2.) для этого создайте минимальный воспроизводимый пример сначала.   -  person    schedule 06.10.2017
comment
Надеюсь теперь правильно :)   -  person Dykow    schedule 06.10.2017
comment
Попробуйте while(!(inb(0x64) & 2)) ; return inb(0x60); в getScancode(). Это будет ждать, пока буфер клавиатуры не станет непустым, прежде чем читать скан-код.   -  person Ian Abbott    schedule 06.10.2017
comment
Пожалуйста, отформатируйте код правильно. getScancode - беспорядок.   -  person Jabberwocky    schedule 06.10.2017
comment
@IanAbbott while(!(inb(0x64) & 2)) ; return inb(0x60); в getScancode() дает тот же результат.   -  person Dykow    schedule 06.10.2017


Ответы (1)


Я думаю, что нашел второе лучшее решение. Я использовал эту функцию:

// Sends a 8/16/32-bit value on a I/O location
static inline void outb(uint16_t port, uint8_t val){
  asm volatile ( "outb %0, %1" : : "a"(val), "Nd"(port) );

Размещено

outb(0x60, 0x0); 

in

char getScancode(){

  char c=0;
  outb(0x60, 0x0);
  do{
    if(inb(0x60) != c){
      c=inb(0x60);
      if(c>0)
      return c;
    }
  }while(1);
}

По некоторым причинам порт 0x60 не был пуст после нажатия клавиши. (Если так и должно быть)

person Dykow    schedule 08.10.2017