![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 15:55 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » [原创]dos下的中断驻留程序完整问题? |
| 可打印版本 1,365 / 5 |
| 第1楼 xyh36014789 | 发表于 2007-11-06 11:11 |
| 初级用户 发帖 32 积分 91 | |
|
[原创]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(); } |
|
| 第2楼 jojand | 发表于 2007-11-06 16:55 |
| 初级用户 发帖 57 积分 117 | |
|
编写任何硬件中断都要在末尾加上下面两行:
mov al,20 out 20,al 若硬件中断不以这两行结尾的话,8259就不会将其内部的寄存器清零,这样将很容易导致程序失控 |
|
| 第3楼 xyh36014789 | 发表于 2007-11-07 14:08 |
| 初级用户 发帖 32 积分 91 | |
|
俺在函数中void interrupt handler(__CPPARGS) 好象有outportb(0x20,0x20);
这个啊 |
|
| 第4楼 xyh36014789 | 发表于 2007-11-07 14:12 |
| 初级用户 发帖 32 积分 91 | |
|
谁能帮俺,按决定出血,用一个月的饭钱做酬谢!
|
|
| 第5楼 220110 | 发表于 2007-11-08 21:04 |
| 荣誉版主 发帖 313 积分 718 | |
Originally posted by xyh36014789 at 2007-11-7 14:12: 鄙视~帮你的不要钱,要钱的不帮你~ 下面程序就是irq3实现定时器定时中断功能,现在是打印“Welcome to JHW of ZhengZhou" (本来是用来定时操作文件的), 既然定时操作用,何不屏蔽了KEYBOARD的INTERRUPT~ |
|
| 第6楼 zxg1234 | 发表于 2008-01-10 19:12 |
| 新手上路 发帖 7 积分 16 | |
|
在驻留程序要考虑DOS的重入问题,如果你的驻留激活时被中断的程序在调用DOS的内核INT21的话,就有可能产生重入了,因此你在你的驻留程序中要检查DOS的INDOS标志以及严重错误标志,二个标志位都可以调用DOS的系统功能来获的,只能在标志位是不忙是你才可以激活你的驻留部分,这样才不会产生DOS重入这叫做重入避开法.才不会使系统当机.
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |