标题: 请教DJGPP下挂中断的问题.
[打印本页]
作者: surface
时间: 2003-6-12 00:00
标题: 请教DJGPP下挂中断的问题.
__dpmi_set_protected_mode_interrupt_vector如何用?好像还得锁内存?是不是很繁琐啊?
这个函数和__go32_dpmi_chain_protected_mode_interrupt_vector有什么区别?我的程序有两个中断,用chain函数会出问题。
请哪位大侠指点一二!
谢谢!
作者: ATLaS
时间: 2003-7-9 00:00
建议使用_go32_xxx之类的函数来处理c写的中断isr。在djgpp的faq写的很清楚了。
关于chain,应该避免使用,因为它会调用旧的isr。如果在其中有real mode的指令就会有模式切换发生,极大影响效率。
isr中的变量和isr本身的代码段都应该lock,一般有如下宏:
#define END_FUNCTION(x) void x##_end(){}
#define LOCK_VARIABLE(x) _go32_dpmi_lock_data((void *)&x, (long)sizeof(x));
#define LOCK_FUNCTION(x) _go32_dpmi_lock_code(x, (long)x##_end - (long)x);
...
void my_isr(void)
{
...
outp(0x20, 0x20);
}
END_FUNCTION(my_isr);
...
中断初始化部分:
_go32_dpmi_seginfo OldISR, NewISR;
LOCK_FUNCTION(my_isr);
LOCK_VARIABLE(my_variable);
...
_go32_dpmi_get_protected_mode_interrupt_vector(IRQNum, &OldISR);
NewISR.pm_offset = (int)my_isr;
NewISR.pm_selector = _go32_my_cs();
_go32_dpmi_set_protected_mode_interrupt_vector(IRQNum,&NewISR);
//还有设置中断的掩码,outp(0x21, inp(0x21) & xxH);
...
// main loop here
...
_go32_dpmi_set_protected_mode_interrupt_vector(IRQNum, &OldISR);
应该尽量避免模式切换,所以要避免直接或间接调用dos/bios功能。
[此贴子已经被作者于2003-7-10 0:01:33编辑过]