DOS下的中断高手请进! ( 积分: 100 )

江远

Unregistered / Unconfirmed
GUEST, unregistred user!
本人本是一个DELPHI FAN,但无奈需要去写DOS下的BC31程序,好在还是Borland公司!
问题:
如何让程序每20微秒产生一个中断?注:不能用空循环,因为中间还要做别的事
 
本人本是一个DELPHI FAN,但无奈需要去写DOS下的BC31程序,好在还是Borland公司!
问题:
如何让程序每20微秒产生一个中断?注:不能用空循环,因为中间还要做别的事
 
修改Int8向量,修改8253的定时周期
 
谢谢tseug!
能给出详细的代码吗?本人的C语言功底实在太差
其他知道的朋友也请多指点!
 
{ 我也还常写些DOS下的控制程序, 以下是我的1/10000秒的定时程序代码,
现在速度快的电脑可以做到1/100000秒的准确延时, 希望对你又帮助.
borland pascal 和 borland C++差不多
}
unit my_crt;
interface
procedure delay_10000(delay_count : word);
procedure delay(delay_count : word);
implementation
var DelayCnt_10000 : longint;
DelayCnt_1000 : longint;
Delay_all : longint;
{ Delay one timer tick or by CX iterations }
procedure delayLoop;
assembler;
asm
@@1: sub word ptr[delay_all],1
sbb word ptr[delay_all+2],0
JC @@2
CMP BL,ES:[DI]
JE @@1
@@2: RET
end;

procedure initialize_myCrt;
begin
asm
MOV ES,Seg0040
MOV DI,006CH
MOV BL,ES:[DI]
@@2: CMP BL,ES:[DI]
JE @@2
MOV BL,ES:[DI]
mov word ptr[delay_all],0ffffh
mov word ptr[delay_all+2],0ffffh
CWD
CALL DelayLoop
end;
DelayCnt_10000 := -delay_all div 550;
DelayCnt_1000 := -delay_all div 55;
end;

procedure delay_10000(delay_count : word);
assembler;
asm
MOV CX,delay_count
JCXZ @@2
MOV ES,Seg0040
XOR DI,DI
MOV BL,ES:[DI]
@@1: mov ax,word ptr [delaycnt_10000]
mov dx,word ptr [delaycnt_10000+2]
mov word ptr [delay_all],ax
mov word ptr [delay_all+2],dx
XOR DX,DX
CALL DelayLoop
LOOP @@1
@@2: mov al,0
end;

procedure delay(delay_count : word);
assembler;
asm
MOV CX,delay_count
JCXZ @@2
MOV ES,Seg0040
XOR DI,DI
MOV BL,ES:[DI]
@@1: mov ax,word ptr [delaycnt_1000]
mov dx,word ptr [delaycnt_1000+2]
mov word ptr [delay_all],ax
mov word ptr [delay_all+2],dx
XOR DX,DX
CALL DelayLoop
LOOP @@1
@@2: mov al,0
end;

begin
initialize_mycrt;
end.
 
谢谢天河流星!
不过我不是要延时,而是要产生一个中断.
再次感谢关注!
 
有money的话联系我
zgsdqd@126.com
 
同意tseug的办法,利用主板上硬件定时器,时间周期准确,不占CPU资源,拦截中断就是了。
 
参考下面的文章
http://www.china-askpro.com/msg49/qa40.shtml
 
谢谢各位!
to tseug:
你所说的程序我看过了,谢谢!不过它的精度太低,秒级,而我要求的是微秒级
没办法,只好用延时程序,以下是我从网上找的一个延时程序,为什么在PC104上一运行
就重启系统了.而我在笔记本上运行时没有问题,
哪位朋友帮忙看一下!(下午调了一下午的空循环,还是不好使)
void TimeDelay(unsigned long microsec) /*延时函数 传入微秒数*/
{
 union REGS r;
 r.h.ah=0x86;
 r.x.cx=microsec>>16;
 r.x.dx=microsec;
 int86(0x15,&r,&r);
}
 
谢谢各位!最后还是用一个空循环,不过上面的方法更好!
8253不会用,应该是最佳的选择!
 
顶部