我有一个类似空间影响的项目,我尝试处理键盘中断。我的问题是我不想在global variable(ship)
中使用my_keyboard_interrupt_handler
。但是我将船作为paremeter发送到此功能,我不知道如何安排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;
}
我的键盘中断处理程序:
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函数
答案 0 :(得分:4)
好吧,如果您在ISR中仅使用ship
,那么您也可以在此函数中声明它是静态的:
void interrupt my_keyboard_interrupt_handler()
{
static space_ship ship = {0};
...
print_space_ship(ship);
}
但是如果您在其他线程或ISR中使用它,那么您必须将其声明为共享(全局)变量,并使用标准OS资源(例如Semaphore,或更可能是Mutex)保护它)在需要的地方。
如果情况确实如此,那么将其作为参数传递给ISR不会有任何区别。