DOS下的DJGPP环境如何勾连硬件中断

本文介绍了DJGPP下如何安装硬件IRQ5中断。

首先,声明一个中断服务子函数:

       //声明中断服务子函数,ISR

       void fn(void)

       {

              //...............

              //...............

              //...............

              outportb(0x20,0x20);    //开硬件中断

       }

 

然后开放中断位、声明信息变量、挂接:

       #define INTR 0x0D                                         /*IRQ5中断向量是0x0D*/

       unsigned char IRQ_bit;

       unsigned char IRQ_bit_old;

 

       IRQ_bit=IRQ_bit_old=inportb(0x21);                       //读入中断的屏蔽位,并保存

       outportb(0x21,(IRQ_bit & 0xdf));                                   //开放想要的中断口——IRQ5

 

       _go32_dpmi_seginfo     new_info;                            //新的信息变量

       _go32_dpmi_seginfo     old_info;                             //新老两个段信息变量

 

       new_info.pm_offset=(int)fn;                                    //挂接中断服务子程序名

       new_info.pm_selector=_go32_my_cs();

 

       _go32_dpmi_get_protected_mode_interrupt_vector(INTR,&old_info); //保存老的

       _go32_dpmi_allocate_iret_wrapper(&new_info);                                   //锁定

       _go32_dpmi_set_protected_mode_interrupt_vector(INTR,&new_info); //勾连

 

现在可以使用硬件中断了………………..

 

最后,从程序退出时,恢复刚刚的设置:

       outportb(0x21,IRQ_bit_old);                                    //恢复以前保存的中断屏蔽位

       _go32_dpmi_set_protected_mode_interrupt_vector(INTR,&old_info);  //还原

       _go32_dpmi_free_iret_wrapper(&new_info);

注意:

1.       中断服务程序的最后必须使用outportb(0x20,0x20);

2.       中断服务程序、及其中涉及的变量应该锁定在物理内存中,不要参与操作系统的虚拟内存交换,使用 DJGPP函数_go32_dpmi_lock_data( )_go32_dpmi_lock_code( )DOS系统下和DJGPP配合使用最好的Allegro已经完整的提供对两个函数的封装。

 

 

 

你可能感兴趣的:(vector,dos,Go,wrapper)