Board logo

标题: 请教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编辑过]