c全局变量用法中的键盘中断句柄

Mel*_*taş 6 c dos interrupt turbo-c

我有一个像空间影响的项目,我试图处理键盘中断.我的问题是我不想使用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;
}
Run Code Online (Sandbox Code Playgroud)

我的键盘中断处理程序:

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);
}
Run Code Online (Sandbox Code Playgroud)

简而言之,我想做void interrupt my_keyboard_interrupt_handler(space_ship* ship){..}.但我不知道在这种情况下如何处理setvect函数

bar*_*nos 4

好吧,如果您ship 在 ISR 中使用,那么您不妨在该函数中将其声明为静态:

void interrupt my_keyboard_interrupt_handler()
{
    static space_ship ship = {0};
    ...
    print_space_ship(ship);
}
Run Code Online (Sandbox Code Playgroud)

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

如果情况确实如此,那么将其作为参数传递给 ISR 不会产生任何影响。