中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 请教DJGPP下挂中断的问题. 上一主题 | 下一主题
surface
初级用户




积分 109
发帖 1
注册 2003-6-11
状态 离线
『楼 主』:  请教DJGPP下挂中断的问题.

__dpmi_set_protected_mode_interrupt_vector如何用?好像还得锁内存?是不是很繁琐啊?
这个函数和__go32_dpmi_chain_protected_mode_interrupt_vector有什么区别?我的程序有两个中断,用chain函数会出问题。

请哪位大侠指点一二!
谢谢!

2003-6-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ATLaS
初级用户




积分 169
发帖 29
注册 2003-7-9
状态 离线
『第 2 楼』:  

建议使用_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编辑过]




2003-7-9 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: