|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『楼 主』:
[原创]dos下的中断驻留程序完整问题?
我有个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 楼』:
编写任何硬件中断都要在末尾加上下面两行:
mov al,20
out 20,al
若硬件中断不以这两行结尾的话,8259就不会将其内部的寄存器清零,这样将很容易导致程序失控
|
在她弯下腰的瞬间 我彷佛看见 那神秘柔和的曲线 如云雾中岭壑的蜿蜒 |
|
2007-11-6 16:55 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
3 楼』:
俺在函数中void interrupt handler(__CPPARGS) 好象有outportb(0x20,0x20);
这个啊
|
|
2007-11-7 14:08 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
4 楼』:
谁能帮俺,按决定出血,用一个月的饭钱做酬谢!
|
|
2007-11-7 14:12 |
|
|
220110
荣誉版主
积分 718
发帖 313
注册 2005-9-26
状态 离线
|
『第
5 楼』:
Quote: | Originally posted by xyh36014789 at 2007-11-7 14:12:
谁能帮俺,按决定出血,用一个月的饭钱做酬谢! |
|
鄙视~帮你的不要钱,要钱的不帮你~
Quote: | 下面程序就是irq3实现定时器定时中断功能,现在是打印“Welcome to JHW of ZhengZhou" (本来是用来定时操作文件的), |
|
既然定时操作用,何不屏蔽了KEYBOARD的INTERRUPT~
|
|
2007-11-8 21:04 |
|
|
zxg1234
新手上路
积分 16
发帖 7
注册 2007-7-26
状态 离线
|
『第
6 楼』:
在驻留程序要考虑DOS的重入问题,如果你的驻留激活时被中断的程序在调用DOS的内核INT21的话,就有可能产生重入了,因此你在你的驻留程序中要检查DOS的INDOS标志以及严重错误标志,二个标志位都可以调用DOS的系统功能来获的,只能在标志位是不忙是你才可以激活你的驻留部分,这样才不会产生DOS重入这叫做重入避开法.才不会使系统当机.
|
|
2008-1-10 19:12 |
|