[Back to ISR SWAG index] [Back to Main SWAG index] [Original]
BC> I have the desire to create a Type of "watch dog" Procedure For a Program
BC> I am writing. It has become increasingly attractive For me to create this
BC> Procedure to activate at certain times every hour - i.e. at 15 past and 45
BC> past the hour.
Perhaps if you insert this code into your Program. It works With the ISR 1C
called by the timerinterrupt 8 periodically. For testing reasons it calls the
batchFile at 15 and 45 seconds. Change finally the line "if(s=15) or (s=45)" to
"if (m=15) or (m=45)" to test the minutes.
Code written in TP6.0 :
{$M 16384,0,16384} (*Adjust to your requirements*)
Uses Dos,Crt;
Const
WDTryTime = 18; (*18 ticks = about every second*)
BatchFileName = 'woufwouf.bat'; (*BatchFile to start*) <<<your BatchFilename
Var
WDCount : Integer;
WDBusy,WdEvent : Boolean;
WDSave1c,WDSaveExit: Pointer;
DosReentrant : ^Byte;
IntVec : Array[0..255] of Pointer Absolute 0:0;
Procedure STI;
Inline($FB);
Procedure CLI;
Inline($FA);
(*Do not use Turbo-Pascal I/O Routines in here.*)
(*Be also sure not to use GetTime/Date at the same time as this routine*)
Procedure WatchDog;interrupt;
Var h,m,s,c : Word;
begin
if not WDBusy then
begin
WDBusy:=True;
inc(WDCount);
if DosReentrant^=0 then (*No Dos op's in work ?*)
if WDCount>=WdTryTime then (*Test only every second to prevent*)
begin (*big loss in perFormance. *)
WDCount:=0;
GetTime(h,m,s,c); (*Get Time*)
here>>> if(s=15) or (s=45) then (*Call on 15 minutes and 45 minutes*)
begin
Cli;IntVec[$1c]:=WDSave1C;Sti;
Port[$20]:=$a0;(*Report TimerInt finished to Interrupt-contr.*)
Port[$20]:=$20;
SwapVectors; (*Execute COMMand.COM + batchFile*)
Exec(GetEnv('COMSPEC'),'/C '+batchFilename);
SwapVectors;
Cli;IntVec[$1c]:=@Watchdog;Sti;
WDEvent:=True;
end;
end;
WDBusy:=False;
end;
end;
Procedure WDRemove;
begin
SetIntVec($1C,WDSave1c); (*Restore old 1c routine*)
ExitProc:=WDSaveExit;
Writeln('Exiting Watchdog');
Halt(Exitcode);
end;
Procedure WDInstall;
Var Regs:Registers;
begin
With Regs do
begin
ah:=$34;
MsDos(regs);
DosReentrant:=ptr(es,bx); (*Get Reentrant Pointer*);
end;
WdCount:=0;
WDBusy:=False;
WDEvent:=False;
GetIntVec($1C,WDSave1C); (*Save old 1c routine*)
SetIntVec($1C,@Watchdog); (*Assign Watchdog to int 1c*)
WDSaveExit:=ExitProc;
ExitProc:=@WDRemove;
Writeln('Watchdog installed');
end;
Var c:Char;
begin
WDInstall;
Repeat (*Example Main Loop*)
Write('Hello');
if WDEvent then (*Watch sign of Watchdog*)
begin
Writeln;Writeln('Event occured');
WDEvent:=False;
end;
Delay(1000);
Until KeyPressed;
c:=ReadKey;
end.
[Back to ISR SWAG index] [Back to Main SWAG index] [Original]