Обработка прерываний клавиатуры в использовании глобальной переменной c

У меня есть проект, похожий на пробел, и я пытаюсь обработать прерывание клавиатуры. Моя проблема в том, что я не хочу использовать 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 в этой ситуации.

1 ответ

Решение

Ну, если вы используете ship только в ISR, вы можете также объявить его статическим внутри этой функции:

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

Но если вы используете его в других потоках или ISR, вы должны объявить его как общую (глобальную) переменную и защитить его с помощью стандартного ресурса ОС (такого как семафор или, что более вероятно, Mutex), где это необходимо.

Если это действительно так, то передача его в качестве аргумента ISR не будет иметь никакого значения.

Другие вопросы по тегам