在C语言中如何处理键盘中断并使用全局变量

6

我有一个类似于太空碰撞的项目,我试图处理键盘中断。我的问题是我不想在my_keyboard_interrupt_handler中使用全局变量(ship)。但是我将ship作为参数传递给此函数,我不知道如何安排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函数。

哟!这是哪个操作系统?如果你在硬编码中断处理程序,那就很有趣了。 - DevSolar
主题:MS-DOS,Turbo C++ 3.0 - Melih Altıntaş
已为您添加了标签;这将显著增加您获得有意义答案的机会。(您是否考虑过切换到更,呃,现代化的环境?) - DevSolar
1个回答

4

如果你只在ISR中使用ship,那么最好将其声明为静态变量:

void interrupt my_keyboard_interrupt_handler()
{
    static space_ship ship = {0};
    ...
    print_space_ship(ship);
}

但是,如果您在其他线程或ISR中使用它,则必须将其声明为共享(全局)变量,并在需要时使用标准操作系统资源(例如Semaphore,或更有可能的Mutex)进行保护。

如果确实是这种情况,那么将其作为参数传递给ISR不会有任何区别。


谢谢你的回答。我会在其他函数中使用它。所以我必须声明为全局变量或者作为参数传递。但是如果我将ship作为参数传递,setvect函数就无法接受带有参数的my_keyboard_interrupt_handler函数了 :( - Melih Altıntaş
1
你不能将船作为参数发送到中断处理程序;你必须使用全局变量(或者更准确地说,具有文件作用域的变量,可能在包含中断处理程序的源文件之外可见)。 - Jonathan Leffler
1
@Melih Altıntaş:ISR的原型(声明)不允许您向函数传递参数。但是我在我的答案中所指的是,即使它允许您传递参数,也不会有帮助,因为您仍然必须通过确保互斥性来保护该参数。实际上,这可能就是为什么此函数原型一开始没有带任何参数的原因。它防止用户错误地假设函数内部的输入参数是互斥的。 - barak manos
@JonathanLeffler 和 barakmanos,感谢你们详细的解释。 - Melih Altıntaş

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接