我有一个类似太空影响的项目,我尝试处理键盘中断。我的问题是我不想在global variable(ship)中使用my_keyboard_interrupt_handler。但是我将ship作为参数发送给此函数,我不知道如何安排setvect(0x09,my_keyboard_interrupt_handler);.İf有任何使用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函数。

最佳答案

好吧,如果您在ISR中仅使用ship ,只使用,那么您也可以在此函数中将其声明为静态:

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

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

如果确实如此,那么将其作为ISR的参数传递不会有任何区别。

关于c - C全局变量用法中的键盘中断句柄,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22378861/

10-12 21:06