本文介绍了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已经完整的提供对两个函数的封装。