Ручка прерывания клавиатуры в использовании глобальной переменной c
у меня есть проект, такой как space impact, и я пытаюсь обрабатывать прерывание клавиатуры.Моя проблема в том, что я не хочу использовать global variable(ship)
на my_keyboard_interrupt_handler
.Но я посылаю корабль как пареметр на эту функцию, я не знаю, как организовать setvect(0x09,my_keyboard_interrupt_handler);
.Если есть какой-либо способ использовать функцию setvect, пожалуйста, дайте мне совет.
int main()
{
void interrupt (*old_keyboard_interrupt_handler)();
ship = (space_ship*)malloc(sizeof(space_ship));
old_keyboard_interrupt_handler = getvect(0x09);
...
setvect(0x09,my_keyboard_interrupt_handler);
return 0;
}
int handle_key()
{
int key;
asm{
sti
in al,60H
xor ah,ah
mov key,ax
in al,61h
or al,82h
out 61h,al
and al,7fh
out 61h,al
mov al,20h
out 20h,al
}
return key;
}
моя клавиатура interupt обработчик:
void interrupt my_keyboard_interrupt_handler()
{
int key = handle_key();
if(key == SPACE){
}else if(key == RIGHT){
ship->column++;
}else if(key == LEFT){
ship->column--;
}else if(key == UP){
ship->row_start--;
ship->row_end--;
} else if(key == DOWN){
ship->row_start++;
ship->row_end++;
}else if(key == ESC){
}
clrscr();
print_space_ship(ship);
}
вкратце я хочу сделать void interrupt my_keyboard_interrupt_handler(space_ship* ship){..}
.Но я не знаю, как обрабатывать функцию setvect в этом ситуация
1 ответов
Ну, если вы используете ship
только в ISR, то вы можете также объявить его статическим внутри этой функции:
void interrupt my_keyboard_interrupt_handler()
{
static space_ship ship = {0};
...
print_space_ship(ship);
}
но если вы используете его в других потоках или ISRs, то вы должны объявить его как общую (глобальную) переменную и защитить его стандартным ресурсом ОС (например, семафором или, скорее всего, - мьютексом), где это необходимо.
Если это действительно так, то передача его в качестве аргумента ISR не будет делать никаких разница.