代码之家  ›  专栏  ›  技术社区  ›  Melih Altıntaş

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

  •  6
  • Melih Altıntaş  · 技术社区  · 10 年前

    我有一个类似空间影响的项目,我试图处理键盘中断。我的问题是我不想使用 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;
    }
    

    我的键盘中断处理程序:

    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 回复  |  直到 10 年前
        1
  •  4
  •   barak manos    10 年前

    如果你使用 ship 只有 在ISR中,那么您可以在该函数中声明它是静态的:

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

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

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