| 
 
xyh36014789 
初级用户
 
  
 
  
  
积分 91 
发帖 32 
注册 2007-6-22 
状态 离线
 | 
『楼 主』:
 [原创]dos下的中断驻留程序完整问题?
 
使用 LLM 解释/回答一下
  
我有个irq3得中断,硬件已经初始化了,可以产生中断,但是程序感觉着还是不太完整,不知道那里需要补充? 
   下面程序就是irq3实现定时器定时中断功能,现在是打印“Welcome to JHW of ZhengZhou" (本来是用来定时操作文件的),如果开机运行该程序的话,完全没有问题,可是只要我按下键盘,程序就停止,不知道为何?是不是在程序中的没有考虑键盘中断的影响呢?不知道该怎么接管int 13H int 28H 
QQ:36014789 
 
#include <stdio.h> 
#include <dos.h> 
#include <conio.h> 
#include <process.h> 
#include <sys/timeb.h> 
#include <fcntl.h> d4 
#include <sys\stat.h> 
#include <share.h> 
#include <IO.H> 
 
#define INTR 0X0b 
#define Freq1 400 
#define Freq2  10000 
#define Data1_add 0x2bc 
#define Data2_add 0x2bd 
 
#define Control_add 0x2bf 
 
#ifdef __cplusplus 
  #define __CPPARGS ... 
#else 
  #define __CPPARGS 
#endif 
 
void interrupt ( *oldhandler)(__CPPARGS); 
void interrupt handler(__CPPARGS); 
void init8253(); 
void install_newtimer(); 
 
int main(void) 
  { 
        install_newtimer();//安装中断 
        init8253(); //初始化 
              keep(0,_SS+(_SP/16)-_psp);    //驻留  
        return 0; 
  } 
 
 
//安装中断 
void install_newtimer() 
  {           int zd; 
        disable(); 
        oldhandler = getvect(INTR); 
        setvect(INTR, handler); 
        zd=inportb(0x21); 
        delay(1); 
        outportb(0x21,zd&~(0x08)); 
        enable(); 
   } 
 
//终端函数 
void interrupt handler(__CPPARGS) 
  {    
        disable(); 
        outportb(0x2b9,0x00);//关125 
        puts("asdfdfd\n"); 
        outportb(0x20,0x20); 
        outportb(0x2b9,0x01);//开125 
        enable(); 
} 
 
//初始化 
void init8253() 
{ 
        int sendhigh,sendlow; 
        disable(); 
        sendhigh=(Freq1&0xff00)>>8; 
        sendlow=Freq1&0x00ff; 
 
        outportb(Control_add,0x36); 
        delay(1); 
        outportb(Data1_add,sendlow); 
        delay(1); 
        outportb(Data1_add,sendhigh); 
        delay(1); 
 
        sendhigh=(Freq2&0xff00)>>8; 
        sendlow=Freq2&0x00ff; 
 
 
        outportb(Control_add,0x76); 
        delay(1); 
        outportb(Data2_add,sendlow); 
        delay(1); 
        outportb(Data2_add,sendhigh); 
        delay(1); 
        outportb(0x2b9,0x01);//开125 
        enable(); 
} 
 
    
 
  
 |   
 | 
  2007-11-6 11:11 | 
  
 | 
 | 
 
jojand 
初级用户
 
  
 
  
  
积分 117 
发帖 57 
注册 2007-10-23 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
编写任何硬件中断都要在末尾加上下面两行: 
mov al,20 
out 20,al 
若硬件中断不以这两行结尾的话,8259就不会将其内部的寄存器清零,这样将很容易导致程序失控 
 
    
 
  
  |  
                  
  
                    在她弯下腰的瞬间 我彷佛看见 那神秘柔和的曲线 如云雾中岭壑的蜿蜒 |   
 | 
  2007-11-6 16:55 | 
  
 | 
 | 
 
xyh36014789 
初级用户
 
  
 
  
  
积分 91 
发帖 32 
注册 2007-6-22 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
俺在函数中void interrupt handler(__CPPARGS) 好象有outportb(0x20,0x20); 
这个啊 
 
    
 
  
 |   
 | 
  2007-11-7 14:08 | 
  
 | 
 | 
 
xyh36014789 
初级用户
 
  
 
  
  
积分 91 
发帖 32 
注册 2007-6-22 
状态 离线
 | 
 | 
  2007-11-7 14:12 | 
  
 | 
 | 
 
220110 
荣誉版主
 
       
 
  
 
积分 718 
发帖 313 
注册 2005-9-26 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
Originally posted by xyh36014789 at 2007-11-7 14:12: 
谁能帮俺,按决定出血,用一个月的饭钱做酬谢!  
鄙视~帮你的不要钱,要钱的不帮你~
 下面程序就是irq3实现定时器定时中断功能,现在是打印“Welcome to JHW of ZhengZhou" (本来是用来定时操作文件的), 
既然定时操作用,何不屏蔽了KEYBOARD的INTERRUPT~  
 
    
 
  
 |   
 | 
  2007-11-8 21:04 | 
  
 | 
 | 
 
zxg1234 
新手上路
 
 
 
  
  
积分 16 
发帖 7 
注册 2007-7-26 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
在驻留程序要考虑DOS的重入问题,如果你的驻留激活时被中断的程序在调用DOS的内核INT21的话,就有可能产生重入了,因此你在你的驻留程序中要检查DOS的INDOS标志以及严重错误标志,二个标志位都可以调用DOS的系统功能来获的,只能在标志位是不忙是你才可以激活你的驻留部分,这样才不会产生DOS重入这叫做重入避开法.才不会使系统当机. 
 
    
 
  
 |   
 | 
  2008-1-10 19:12 | 
  
 |